5 votes

Fractionner des lignes avec plusieurs mots en Python

J'ai une sortie txt (très moche) d'une requête SQL exécutée par un système externe que je ne peux pas modifier. Voici l'exemple de sortie :

FruitName      Owner             OwnerPhone
=============  ================= ============
Red Apple      Sr Lorem Ipsum    123123
Yellow Banana  Ms Dolor sir Amet 456456

Comme vous pouvez le voir, le FruitName et la colonne Owner La colonne peut être composée de quelques mots et il n'y a pas de modèle fixe dans le nombre de mots qui peuvent être dans ces colonnes. Si j'utilise line.split() pour faire un tableau sur chaque ligne Python, il enlèvera tous les espaces et le tableau deviendra comme ceci :

['Red', 'Apple', 'Sr', 'Lorem', 'Ipsum', '123123']
['Yellow', 'Banana', 'Ms', 'Dolor', 'sir', 'Amet', '456456']

La question est de savoir comment je peux le diviser correctement en sortie comme ceci :

['Red Apple', 'Sr Lorem Ipsum', '123123']
['Yellow Banana', 'Ms Dolor sir Amet', '456456']

Je suis un débutant en Python et je ne sais pas si cela est possible ou non. Toute aide sera très appréciée. Merci !

1voto

slider Points 2110

Vous pouvez utiliser le ==== Les diviseurs sont avantageux car ils permettent d'obtenir des tranches dans toutes les lignes correspondant aux indices de début et de fin de chaque ligne. ==== qui représente une colonne :

def get_divider_indices(line):
  i, j = 0, line.index(' ')
  indices = []
  while i != -1:
    indices.append((i, j))
    i = line.find('=', j)
    j = line.find(' ', i)
    if j == -1: j = len(line)
  return indices

with open('data.txt', 'r') as f:
  lines = f.readlines()
  dividers = get_divider_indices(lines[1])
  rows= []
  for line in lines[2:]:
    rows.append([line[s:e].strip() for s, e in dividers])

print(rows)

Sortie

[['Red Apple', 'Sr Lorem Ipsum', '123123'], ['Yellow Banana', 'Ms Dolor sir Amet', '456456']]

Notez que vous pouvez utiliser str.find() pour obtenir l'indice d'un caractère dans une chaîne (que j'utilise ci-dessus pour obtenir l'indice d'un = ou un espace dans la ligne de séparation).

1voto

furas Points 9923

Les colonnes ont une largeur fixe, ce qui vous permet de l'utiliser et de découper les lignes.

data = '''FruitName      Owner             OwnerPhone
=============  ================= ============
Red Apple      Sr Lorem Ipsum    123123
Yellow Banana  Ms Dolor sir Amet 456456'''

lines = data.split('\n')

for line in lines[2:]:
    fruit = line[:13].strip()
    owner = line[13:32].strip()
    phone = line[32:].strip()
    print([fruit, owner, phone])

Une solution plus complexe utiliserait la deuxième ligne - avec === - pour calculer les largeurs des colonnes et les utiliser dans le découpage.

1voto

MD.Tabish Mahfuz Points 676

Comme l'ont suggéré d'autres personnes, vous pouvez utiliser la longueur de chaque diviseur pour calculer la longueur de l'arbre de transmission. columns . L'exemple suivant en est une illustration :

rows = list()
with open('data.txt', 'r') as f:
    lines = f.readlines()

    dividers = lines[1].split() 

    for line in lines[2:]:
        row = []
        prvLength = 0
        for d in dividers:
            start = prvLength
            length = start+len(d)+1
            row.append(line[start:start+length].strip())
            prvLength += length
        rows.append(row)
print(rows)

Sortie

[['Red Apple', 'Sr Lorem Ipsum', '123123'], ['Yellow Banana', 'Ms Dolor sir Amet', '456456']]

Vous pouvez aussi vérifier si les colonnes sont séparées par des TABS c'est-à-dire '\t' . Si c'est le cas, vous pouvez simplement diviser le line de lines en utilisant line.split('\t') ce qui serait beaucoup plus simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X