2014-09-10 2 views
2

J'ai ce que je pense être un fichier texte délimité par des espaces que je voudrais ouvrir et copier certaines données dans des listes (Python 2.7). Ceci est un extrait du fichier de données:Ouverture d'un fichier texte délimité par espace (?) Dans python 2.7?

0.000000  11.00  737.09  1.00  1116.00 
    0.001000  14.00  669.29  10.00  613.70 
    0.002000  15.00  962.27  2.00  623.50 
    0.003000  7.00  880.86  7.00  800.71 
    0.004000  9.00  634.67  3.00  1045.00 
    0.005000  12.00  614.67  3.00  913.33 
    0.006000  12.00  782.58  6.00  841.00 
    0.007000  13.00  860.08  6.00  354.00 
    0.008000  14.00  541.07  4.00  665.25 
    0.009000  14.00  763.00  6.00  1063.00 
    0.010000  9.00  790.33  6.00  857.83 
    0.011000  6.00  899.83  4.00  1070.75 
    0.012000  16.00  710.88  10.00  809.90 
    0.013000  12.00  863.50  7.00  923.14 
    0.014000  9.00  591.67  6.00  633.17 
    0.015000  12.00  740.58  6.00  837.00 
    0.016000  10.00  727.60  7.00  758.00 
    0.017000  12.00  838.75  4.00  638.75 
    0.018000  9.00  991.33  7.00  731.57 
    0.019000  12.00  680.75  5.00  1079.40 
    0.020000  15.00  843.20  3.00  546.00 
    0.021000  11.00  795.18  5.00  1317.20 
    0.022000  9.00  943.33  5.00  911.00 
    0.023000  13.00  711.23  3.00  981.67 
    0.024000  11.00  922.73  5.00  1111.00 
    0.025000  1112.00  683.58  6.00  542.83 
    0.026000  15.00  1053.80  5.00  1144.40 

est Ci-dessous le code que je l'ai essayé, ce qui ne fonctionne pas. J'aimerais avoir deux listes, une de la deuxième et de la quatrième.

listb = [] 
listd = [] 
with open('data_file.txt', 'r') as file:   
    reader = csv.reader(file,delimiter=' ') 
    for a,b,c,d,e in reader: 
     listb.append(int(b)) 
     listd.append(int(d)) 

Qu'est-ce que je fais mal?

+0

Ce fichier semble être une donnée de fichier séparée par des tabulations. – Trimax

Répondre

0

Le problème est les multiples espaces entre les champs (colonnes). CSV signifie valeurs séparées par des virgules. Imaginez une seconde que vous utilisez des virgules au lieu d'espaces. Ligne 1 dans votre fichier alors ressembler à:

,,,,0.000000,,,,,,,11.00,,,,,,737.09,,,,,,,1.00,,,,,1116.00 

Ainsi, le lecteur CSV voit plus de 5 champs (colonnes) dans cette ligne.

Vous avez deux options:

  1. Passer à l'utilisation de séparateurs d'espace unique
  2. Utilisez une fente simple() pour traiter plusieurs espaces:

:

listb = [] 
listd = [] 
with open('text', 'r') as file: 
    for row in file: 
     a, b, c, d, e = row.split() 
     listb.append(int(b)) 
     listd.append(int(d)) 

PS: Une fois que cette partie fonctionne, vous rencontrerez un problème appelant int() sur des chaînes comme "11.00" qui ne sont pas vraiment des entiers. donc je recommande d'utiliser quelque chose comme:

int(float(b)) 
0

Vous pouvez trouver toutes les valeurs dont vous avez besoin, en utilisant regexp

import re 

list_b = [] 
list_d = [] 

with open('C://data_file.txt', 'r') as f: 
    for line in f: 
     list_line = re.findall(r"[\d.\d+']+", line) 
     list_b.append(float(list_line[1])) #appends second column 
     list_d.append(float(list_line[3])) #appends fourth column 

print list_b 
print list_d 
+0

Existe-t-il un moyen de modifier cela pour l'ajouter en tant que nombres entiers afin d'éviter d'avoir à parcourir les listes pour modifier le type par la suite? Edit: faire list_b.append (float (list_line [1])) fonctionne alors que list_b.append (int (list_line [1])) ne fonctionne pas. –

+0

@JohnCrow L'ajout de nombres entiers signifie que vous voulez perdre des chiffres après la virgule? – vks

2

Une alternative consiste à tirer parti de la construction en str.split():

a, b, c, d, e = zip(*((map(float, line.split()) for line in open('data_file.txt')))) 
0
f=open("input.txt",'r') 
x=f.readlines() 
list1=[] 
list2=[] 
import re 
for line in x: 
    pattern=re.compile(r"(\d+)(?=\.)") 
    li=pattern.findall(line) 
    list1.append(li[1]) 
    list2.append(li[3]) 

Vous pouvez utiliser cette option si vous ne voulez capturer integers et non floats.

Questions connexes