1
votes

Lire un fichier texte avec une délimitation de structure donnée avec Python

J'essaie de lire un fichier texte contenant plusieurs champs structurés avec un nombre donné de caractères chacun. Je sais que le premier champ prend n1 caractères, le second champ n2 caractères, ...

Voici ce que j'ai jusqu'à présent, pour une ligne:

['AAA', 'BB', 'CCCC', 'DDDDD', 'E']

La réponse est ce qui suit:

# Line
line = 'AAABBCCCCDDDDDE'

# Array structure
slice_structure  = [3,2,4,5,1]

sliced_array = []
cursor = 0
for n in slice_structure :
    sliced_array.append(line[cursor:cursor+n])
    cursor += n

print(sliced_array)

Mon intention est de créer une fonction avec ce code et de l'appeler pour chaque ligne du fichier. Je suis sûr qu'il doit y avoir une meilleure façon de faire cela.

Merci d'avance.


1 commentaires

Pouvez-vous clarifier votre exemple? Vos noms de champs sont-ils toujours une répétition du même caractère que ci-dessus, ou une chaîne de texte qui doit être délimitée par un nombre défini de caractères ?


4 Réponses :



1
votes

Question : décompressez les champs d'enregistrement structurés avec un nombre donné de caractères chacun.

from struct import unpack

record = 'AAABBCCCCDDDDDE'

fields = [item.decode() for item in 
          unpack('3s2s4s5s1s', bytes(record, 'utf-8'))]

print(fields)
>>> ['AAA', 'BB', 'CCCC', 'DDDDD', 'E']

0 commentaires

1
votes

Si vos noms de champs sont en fait du texte (plutôt qu'un caractère répété) et que vous souhaitez diviser votre chaîne par les valeurs de votre liste de tranches, voici une approche simple / lisible:

['AAA', 'BB', 'CCCC', 'DDDDD', 'E']

Sortie:

# Line
line = 'AAABBCCCCDDDDDE'
# Array structure
slice_structure  = [3,2,4,5,1]
# Results list
result = []

for i in slice_structure:
    result.append(line[:i])
    line = line[i:]

print(result)


0 commentaires

1
votes

Vous pouvez le faire en utilisant les deux méthodes suivantes.

Méthode 1 :
Utilise list.insert pour placer des séparateurs ( '|' ) puis divisez la chaîne à l'aide de ces séparateurs.

Méthode 2 :
Utilise la compréhension de liste.

Method-1: ['AAA', 'BB', 'CCCC', 'DDDDD', 'E']
Method-2: ['AAA', 'BB', 'CCCC', 'DDDDD', 'E']

Sortie :

import numpy as np

# Line
line = 'AAABBCCCCDDDDDE'
# Array structure
slice_structure  = [3,2,4,5,1]
ss = np.array(slice_structure).cumsum()

# Method-1
# >> Uses list.insert to place some separators ('|')
#    and then split the string using these separators.
l = list(line)
for p in np.flip(ss[:-1]):
    l.insert(p,'|')
final_1 = ''.join(l).split('|')
print('Method-1: {}'.format(final_1))

# Method-2
# >> Uses list comprehension
stop_pos = ss.tolist()
start_pos = [0] + ss[:-1].tolist()
final_2 = [line[start:stop] for start, stop in zip(start_pos, stop_pos)]
print('Method-2: {}'.format(final_2))


0 commentaires