Bagaimanakah saya boleh menghuraikan fail lebar tetap dengan cekap dalam Python?

Susan Sarandon
Lepaskan: 2024-10-30 18:28:31
asal
477 orang telah melayarinya

How can I efficiently parse fixed width files in Python?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan