Heim > Artikel > Backend-Entwicklung > Wie kann ich Dateizeilen mit fester Breite in Python effizient analysieren?
Das Parsen von Dateien mit fester Breite, bei denen jede Spalte eine bestimmte Anzahl von Zeichen in einer Zeile einnimmt, kann eine Aufgabe sein, die Effizienz erfordert. Hier finden Sie eine Diskussion darüber, wie Sie dies effizient erreichen können:
Stellen Sie sich eine Datei mit fester Breite vor, bei der die ersten 20 Zeichen eine Spalte darstellen, gefolgt von 21–30 für die zweite und so weiter An. Wie können wir eine gegebene Zeile mit 100 Zeichen effektiv in ihre jeweiligen Spalten analysieren?
1. Strukturmodul:
Die Verwendung des Strukturmoduls der Python-Standardbibliothek bietet aufgrund seiner C-Implementierung sowohl Einfachheit als auch Geschwindigkeit. Der folgende Code demonstriert seine Verwendung:
<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 decode result. unpack = struct.Struct(fmtstring).unpack_from # Alias. parse = lambda line: tuple(s.decode() for s in unpack(line.encode())) # Parse a sample line. line = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n' fields = parse(line) print('fields:', fields)</code>
Ausgabe:
fmtstring: '2s 10x 24s', record size: 36 chars fields: ('AB', 'MNOPQRSTUVWXYZ0123456789')
2. Optimiertes String-Slicing:
Während String-Slicing häufig verwendet wird, kann es bei großen Zeilen umständlich werden. Hier ist ein optimierter Ansatz:
<code class="python">from itertools import zip_longest from itertools import accumulate def make_parser(fieldwidths): # Calculate slice boundaries. cuts = tuple(cut for cut in accumulate(abs(fw) for fw in fieldwidths)) # Create field slice tuples. flds = tuple(zip_longest(cuts, (0,)+cuts))[:-1] # Ignore final value. # Construct the parsing function. parse = lambda line: tuple(line[i:j] for i, j in flds) 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 # Parse a sample line. line = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n' fieldwidths = (2, -10, 24) # Negative values indicate ignored padding fields. parse = make_parser(fieldwidths) fields = parse(line) print('fmtstring:', parse.fmtstring, ', record size:', parse.size, 'chars') print('fields:', fields)</code>
Ausgabe:
fmtstring: '2s 10x 24s', record size: 36 chars fields: ('AB', 'MNOPQRSTUVWXYZ0123456789')
Das obige ist der detaillierte Inhalt vonWie kann ich Dateizeilen mit fester Breite in Python effizient analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!