Penghuraian Fail Lebar Tetap yang Cekap
Fail lebar tetap menimbulkan cabaran apabila perlu menghuraikan kerana struktur tegarnya. Untuk menangani perkara ini, pelbagai pendekatan boleh digunakan untuk mengekstrak data dengan cekap daripada fail tersebut.
Menggunakan Modul struct
Modul struktur perpustakaan standard Python menawarkan ringkas dan pantas penyelesaian untuk menghuraikan garis lebar tetap. Ia membenarkan lebar medan dan jenis data yang dipratentukan, menjadikannya pilihan yang sesuai untuk set data yang besar. Coretan kod berikut menunjukkan cara menggunakan struct untuk tujuan ini:
<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>
Penghirisan Rentetan dengan Pengoptimuman Masa Kompilasi
Penghirisan rentetan ialah kaedah lain yang berdaya maju untuk menghurai tetap fail lebar. Walaupun pada mulanya kurang cekap, teknik yang dikenali sebagai "pengoptimuman masa kompilasi" boleh meningkatkan prestasi dengan ketara. Kod berikut melaksanakan pengoptimuman ini:
<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>
Pendekatan yang dioptimumkan ini menyediakan kedua-dua kecekapan dan kebolehbacaan untuk menghuraikan fail lebar tetap.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menghuraikan fail lebar tetap dengan cekap dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!