Menghuraikan Fail Lebar Tetap Dengan Cekap
Fail lebar tetap memberikan cabaran penghuraian yang unik kerana panjang lajurnya yang telah ditetapkan. Mencari cara yang cekap untuk mengekstrak data daripada fail sedemikian adalah penting untuk pemprosesan data.
Pernyataan Masalah
Diberikan fail dengan garis lebar tetap, di mana setiap lajur mewakili nilai tertentu , bangunkan kaedah yang cekap untuk menghuraikan baris ini kepada komponen yang berasingan. Pada masa ini, penghirisan rentetan digunakan, tetapi kebimbangan mengenai kebolehbacaan dan kesesuaiannya untuk fail besar timbul.
Penyelesaian
Dua kaedah penghuraian yang cekap dibentangkan:
Kaedah 1: Menggunakan Modul struct
Modul struct perpustakaan standard Python menyediakan cara yang mudah untuk membongkar data daripada aliran data binari. Ia boleh digunakan dengan fail lebar tetap dengan menentukan rentetan format yang menentukan lebar dan jenis setiap medan. Kaedah ini menawarkan kedua-dua kelajuan dan kesederhanaan.
Contoh:
<code class="python">import struct fieldwidths = (2, -10, 24) fmtstring = ' '.join('{}{}'.format(abs(fw), 'x' if fw < 0 else 's') for fw in fieldwidths) # Convert Unicode input to bytes and the result back to Unicode string. unpack = struct.Struct(fmtstring).unpack_from # Alias. parse = lambda line: tuple(s.decode() for s in unpack(line.encode())) print('fmtstring: {!r}, record size: {} chars'.format(fmtstring, struct.calcsize(fmtstring))) line = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n' fields = parse(line) print('fields: {}'.format(fields))</code>
Kaedah 2: Menggunakan Penghirisan Rentetan dengan Kompilasi
Walaupun penghirisan rentetan mungkin kelihatan mudah, kelajuannya boleh dipertingkatkan dengan menyusun versi yang lebih cekap menggunakan eval(). Kaedah ini menjana senarai sempadan kepingan yang malar dan oleh itu lebih pantas untuk dilaksanakan.
Contoh (Dioptimumkan):
<code class="python">def make_parser(fieldwidths): cuts = tuple(cut for cut in accumulate(abs(fw) for fw in fieldwidths)) pads = tuple(fw < 0 for fw in fieldwidths) # bool flags for padding fields flds = tuple(zip_longest(pads, (0,)+cuts, cuts))[:-1] # ignore final one slcs = ', '.join('line[{}:{}]'.format(i, j) for pad, i, j in flds if not pad) parse = eval('lambda line: ({})\n'.format(slcs)) # Create and compile source code. # Optional informational function attributes. parse.size = sum(abs(fw) for fw in fieldwidths) parse.fmtstring = ' '.join('{}{}'.format(abs(fw), 'x' if fw < 0 else 's') for fw in fieldwidths) return parse</code>
Kedua-dua kaedah menyediakan cara yang cekap untuk menghuraikan fail lebar tetap. Kaedah 1 menggunakan modul struct mudah digunakan manakala Kaedah 2 menggunakan penghirisan rentetan yang dioptimumkan menawarkan prestasi yang lebih baik sedikit apabila dioptimumkan.
Atas ialah kandungan terperinci Bagaimana Menghuraikan Fail Lebar Tetap dalam Python dengan Cekap: Modul Struktur lwn. Penghirisan Rentetan Dioptimumkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!