Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana Menghuraikan Fail Lebar Tetap dalam Python dengan Cekap: Modul Struktur lwn. Penghirisan Rentetan Dioptimumkan?

Bagaimana Menghuraikan Fail Lebar Tetap dalam Python dengan Cekap: Modul Struktur lwn. Penghirisan Rentetan Dioptimumkan?

DDD
DDDasal
2024-10-31 15:43:03515semak imbas

How to Efficiently Parse Fixed Width Files in Python: Struct Module vs. Optimized String Slicing?

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!

Kenyataan:
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