2014-09-10 2 views
2

У меня есть то, что я считаю текстовым файлом, ограниченным пробелами, который я хотел бы открыть и скопировать некоторые данные в списки (Python 2.7). Это фрагмент файла данных:Открытие текстового файла с разделителями (?) В 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 

Ниже приведен код, я пробовал, не работает. Я хотел бы иметь два списка, по одному по каждому из второго и четвертого столбцов.

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)) 

Что я делаю неправильно?

+0

Этот файл является файлом, разделенным вкладками. – Trimax

ответ

0

Проблема состоит в том, что несколько пробелов между полями (колонны).

CSV означает значения, разделенные запятой. Представьте себе, что вы используете запятую вместо пробелов. Линия 1 в файле будет выглядеть:

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

Таким образом, читатель CSV видит более 5 полей (столбцов) в этой строке.

У вас есть два варианта:

  1. переключиться на использование одиночного пробела сепараторов
  2. Используйте простой раскол(), чтобы иметь дело с несколькими пробелами:

:

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: Когда эта часть работает, вы столкнетесь с проблемой вызова int() в таких строках, как «11.00», которые на самом деле не являются целыми числами. Поэтому я рекомендую использовать что-то вроде:

int(float(b)) 
0

Вы можете найти все необходимые значения, используя РегВыр

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

Есть ли способ изменить это, чтобы добавить как целые числа, чтобы избежать необходимости перебирать списки, чтобы впоследствии изменить тип? Изменить: делать list_b.append (float (list_line [1])) работает, тогда как list_b.append (int (list_line [1])). –

+0

@JohnCrow, добавляя как целые числа, означает, что вы хотите потерять цифры после десятичного числа? – vks

2

Одна альтернатива, чтобы воспользоваться встроенной в 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]) 

Вы можете использовать это, если вы только хотите, чтобы захватить integers и не floats.

Смежные вопросы