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.
4 Réponses :
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']
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']
# 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)
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))
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 ?