3 votes

En python, comment puis-je analyser un fichier texte avec une longue ligne et séparer les éléments dans différentes colonnes ?

J'ai un fichier texte qui ressemble à ceci :

“Distance 1: Distance XY” 1 2 4 5 9  “Distance 2: Distance XY”  3 6 8 10 5  “Distance 3: Distance XY”  88 45 36 12 4   

Tout est regroupé sur une grande ligne comme celle-ci. Ma question est de savoir comment je peux séparer les mesures de distance pour que les lignes ressemblent davantage à ceci :

“Distance 1: Distance XY” 1 2 4 5 9  
“Distance 2: Distance XY”  3 6 8 10 5  
“Distance 3: Distance XY”  88 45 36 12 4  

Je veux faire cela pour créer un dictionnaire pour chaque mesure de distance.

5voto

Psidom Points 115100

Vous pouvez utiliser re.split pour découper la chaîne à l'aide d'expressions régulières :

import re
s = '\"Distance 1: Distance XY\" 1 2 4 5 9  \"Distance 2: Distance XY\"  3 6 8 10 5  \"Distance 3: Distance XY\"  88 45 36 12 4'

re.split(r'(?<=\d)\s+(?=\")', s)

# ['"Distance 1: Distance XY" 1 2 4 5 9',
#  '"Distance 2: Distance XY"  3 6 8 10 5',
#  '"Distance 3: Distance XY"  88 45 36 12 4']

(?<=\d)\s+(?=\") contraint le délimiteur à être l'espace entre un chiffre et un guillemet.

S'il s'agit d'une citation intelligente dans le fichier texte, remplacer \" avec une citation intelligente, option + [ sur mac, vérifier ici pour Windows :

with open("test.txt", 'r') as f:
    for line in f:
        print(re.split(r'(?<=\d)\s+(?=“)', line.rstrip("\n")))

# ['“Distance 1: Distance XY” 1 2 4 5 9', '“Distance 2: Distance XY”  3 6 8 10 5', '“Distance 3: Distance XY”  88 45 36 12 4']

Ou utiliser l'unicode pour les guillemets intelligents de gauche \u201C :

with open("test.csv", 'r') as f:
    for line in f:
        print(re.split(r'(?<=\d)\s+(?=\u201C)', line.rstrip("\n")))

# ['“Distance 1: Distance XY” 1 2 4 5 9', '“Distance 2: Distance XY”  3 6 8 10 5', '“Distance 3: Distance XY”  88 45 36 12 4']

1voto

Andrew Points 348

Une solution peut-être moins élégante que celle de Psidom, en supposant que les lignes aient toujours le même format :

with open("input.txt", 'r') as file:
    line = file.read()
    line = line.split()
    count = 0
    output = open("output.txt", 'w')
    for i in line:
        output.write(i)
        output.write(" ")
        count+=1
        if count == 9:
            output.write("\n")
            count = 0
    output.close()

1voto

joaquinlpereyra Points 649

Une tentative pour améliorer la bonne réponse d'Andrew.

with open("input.txt", 'r') as file:
    output = open("output.txt", 'w')
    for line in file:
        line = line.split()
        relevant_line = line[0:9]
        relevant_line_as_string = " ".join(relevant_line)
        output.write(relevant_line_as_string + '\n')
    output.close()

Vous n'avez pas besoin de fermer si vous utilisez "avec" :)

~ ❯❯❯ touch input
~ ❯❯❯ vim input
~ ❯❯❯ touch script.py
~ ❯❯❯ vim script.py # script.py has my answer copy pasted there
~ ❯❯❯ touch output
~ ❯❯❯ python script.py
~ ❯❯❯ cat output
“Distance 1: Distance XY” 1 2 4 5 9
# it works!

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