Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich Dateizeilen mit fester Breite in Python effizient analysieren?

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 17:09:26374Durchsuche

How can I efficiently parse fixed-width file lines in Python?

Schnelles Parsen von Dateizeilen mit fester Breite

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:

Das Problem

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?

Lösungen

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!

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