Maison > développement back-end > Tutoriel Python > Comment puis-je analyser efficacement des fichiers de largeur fixe en Python ?

Comment puis-je analyser efficacement des fichiers de largeur fixe en Python ?

Susan Sarandon
Libérer: 2024-10-30 18:28:31
original
518 Les gens l'ont consulté

How can I efficiently parse fixed width files in Python?

Analyse efficace des fichiers à largeur fixe

Les fichiers à largeur fixe posent un défi en matière d'analyse en raison de leur structure rigide. Pour résoudre ce problème, plusieurs approches peuvent être utilisées pour extraire efficacement les données de ces fichiers.

Utilisation du module struct

Le module struct de la bibliothèque standard Python offre une solution concise et rapide solution pour analyser les lignes à largeur fixe. Il permet des largeurs de champ et des types de données prédéfinis, ce qui en fait une option appropriée pour les grands ensembles de données. L'extrait de code suivant montre comment utiliser struct à cette fin :

<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>
Copier après la connexion

Découpage de chaînes avec optimisation au moment de la compilation

Le découpage de chaînes est une autre méthode viable pour l'analyse des problèmes corrigés. fichiers de largeur. Bien qu'initialement moins efficace, une technique connue sous le nom d'« optimisation au moment de la compilation » peut améliorer considérablement les performances. Le code suivant implémente cette optimisation :

<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>
Copier après la connexion

Cette approche optimisée offre à la fois efficacité et lisibilité pour l'analyse des fichiers de largeur fixe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal