2 votes

Boucler les lignes d'un fichier texte avec python

Je reçois des fichiers texte qui sont structurés comme ceci :

random
----new data-----
06/19/2018 13:57:39.99 random information here
06/19/2018 13:58:24.99 some more random info
06/19/2018 13:58:35.08  00:00:04.38 A 00000 0 765 228270257 A0   44    45
06/19/2018 13:58:39.99  00:00:00.00 A 00000 0 756 228270257 A0    4     5
06/19/2018 13:58:40.61  00:00:00.00 A 00000 0 828 228270257 A0    1     7
06/19/2018 13:57:39.99 random information here
06/19/2018 13:58:24.99 some more random info
---end data---
random stuff

Il y a plusieurs lignes avec des informations aléatoires autour des données réelles qui m'intéressent. Je ne veux garder que les lignes qui ont A dans la quatrième ligne, et ensuite je veux transformer les données en un fichier CSV.

En supposant que les données ci-dessus sont dans play.txt J'ai essayé plusieurs variantes de cette méthode, qui ne fonctionne pas :

import csv
import pandas as pd
from io import StringIO

id = []
with open('play.txt', 'r') as fi:
    for ln in fi:
        if ln.startswith("A",4):
            id.append(ln[0:])

id2 = ' '.join(id)
df = pd.read_table(StringIO(id2), delimiter=r'\s+', header=None)

print(df)

df.to_csv('out.csv')

Comment faire cela en python ?

0voto

KarmaPenny Points 143

Utilisez les éléments suivants :

with open('play.txt', 'r') as fi:
    for line in fi:
        line = line.split(" ") 
        # you can also use line.split() to split 
        # the line by all whitespace.
        if (len(line)>=4 and line[3]=="A"):
            ...

Cela divise par les espaces, et ensuite vous pouvez utiliser l'indexation de la liste.

Pourquoi ln.startswith("A",4) ne fonctionne pas

Ce code ne fonctionne pas pour deux raisons principales.

  1. Python commence à 0 indexé, donc si vous cherchez la 4ème colonne, vous écrirez ln.startswith("A", 3)
  2. ln.startswith("A", 3) obtient le 4ème caractère littéral de la chaîne. Python lit la ligne comme une chaîne de caractères, qui consiste en le texte que vous avez. Ainsi, en utilisant ln.startswith("A", 3) obtient le 4ème caractère, qui, dans toutes les lignes, est le caractère "1".

0voto

imdevskp Points 1716
# read the file
file = open('play.txt').read()

id = []

# loop through the file and if the fourth word is 'A' then append that line to 'id'
for line in file.splitlines():
    if line.split()[3] == 'A':
        id.append(line.split())

# save to a dataframe
df = pd.DataFrame(id)
df
    0           1           2           3   4       5   6   7           8   9   10
0   06/19/2018  13:58:35.08 00:00:04.38 A   00000   0   765 228270257   A0  44  45
1   06/19/2018  13:58:39.99 00:00:00.00 A   00000   0   756 228270257   A0  4   5
2   06/19/2018  13:58:40.61 00:00:00.00 A   00000   0   828 228270257   A0  1   7

# if you want specify column names too 
# df = pd.DataFrame(id, columns=['col_name_1', 'col_name_2'... ])

# save to csv
df.to_csv('out.csv')

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