Wie kann ich Dateien mit fester Breite in Python effizient analysieren?

Susan Sarandon
Freigeben: 2024-10-30 18:28:31
Original
407 Leute haben es durchsucht

How can I efficiently parse fixed width files in Python?

Effizientes Parsen von Dateien mit fester Breite

Dateien mit fester Breite stellen aufgrund ihrer starren Struktur eine Herausforderung beim Parsen dar. Um dieses Problem zu lösen, können mehrere Ansätze zum effizienten Extrahieren von Daten aus solchen Dateien eingesetzt werden.

Verwendung des Strukturmoduls

Das Strukturmodul der Python-Standardbibliothek bietet eine prägnante und schnelle Lösung Lösung zum Parsen von Linien mit fester Breite. Es ermöglicht vordefinierte Feldbreiten und Datentypen und ist somit eine geeignete Option für große Datensätze. Das folgende Code-Snippet zeigt, wie struct für diesen Zweck verwendet wird:

<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>
Nach dem Login kopieren

String-Slicing mit Optimierung zur Kompilierungszeit

String-Slicing ist eine weitere praktikable Methode zum Parsen von Fehlern width-Dateien. Obwohl zunächst weniger effizient, kann eine Technik namens „Kompilierungszeitoptimierung“ die Leistung erheblich verbessern. Der folgende Code implementiert diese Optimierung:

<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>
Nach dem Login kopieren

Dieser optimierte Ansatz bietet sowohl Effizienz als auch Lesbarkeit für das Parsen von Dateien mit fester Breite.

Das obige ist der detaillierte Inhalt vonWie kann ich Dateien mit fester Breite in Python effizient analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!