2013-03-15 2 views
0

Извините, если мой вопрос слишком прост. Мои результаты сохраняются как текстовый файл из FORTRAN, и я должен опубликовать его с помощью Python. Я попытался использовать функцию split для разделения разных столбцов, однако пространство между разными столбцами не всегда равно. Так есть способ решить мою проблему? Ниже приведены данные:python разделить строки текстового файла

2/ 1/1961 0.0000 0.0019 --------- 0.749E+04 0.353E-02 0.374E-03 
2/ 2/1961 0.0000 0.0021 --------- 0.748E+04 0.353E-02 0.374E-03 
2/ 3/1961 0.0000 0.0000 --------- 0.743E+04 0.350E-02 0.371E-03 
2/ 4/1961 0.0000 0.0000 --------- 0.732E+04 0.345E-02 0.366E-03 
2/ 5/1961 24.0000 24.0000 0.416E-01 0.719E+04 0.339E-02 0.360E-03 
2/ 6/1961 24.0000 0.0000 0.509E-01 0.706E+04 0.333E-02 0.353E-03 

Мне нужно сохранить каждый столбец как отдельную переменную в Python. Если я использую два пробела в качестве разделителя, я дам мне 2/ 5/1961 24.0000 как одну переменную. Если я использую одно пространство, я получу , 2, /, ... Так есть способ обработать мой текстовый файл? Благодаря!

x_date=[] 
fp = open("results_file.txt") 
for i, line in enumerate(fp): 
    if (i >= line_start) and (i <= line_end): 
     line = line.split(' ') 
     x_date_temp = line[0] 
     x_date.append(x_date_temp) 
+0

Просто используйте '.split()' это автоопределение пробельные – wim

+0

@wim, я думаю, что '» 2/6/1961" 'может представлять собой дату, поэтому не должен 't быть разделенным таким образом –

+0

whoops пропустил это – wim

ответ

3

Если это из Fortran, это почти наверняка фиксированной ширины поля, не разграничена пространство, так что это хорошая идея, чтобы прочитать это таким образом. Возможно даже, что если второе поле может быть «124.0000», между этими двумя полями не будет пробелов.

У Python действительно нет встроенного способа чтения полей фиксированной ширины (как для csv). Использование регулярных выражений не так уж плохо, хотя

import re 
x_date = [] 
fp = open("results_file.txt") 
for i, line in enumerate(fp): 
    if (i >= line_start) and (i <= line_end): 
     line = re.match("(.{10})(.{8})(.{8})(.{12})(.{12})(.{12})(.{12})", line).groups() 
     x_date_temp = line[0] 
     x_date.append(x_date_temp) 

Вы также можете повторно сделать вас Dict полей как этот

line_dict = re.match("(?P<date>.{10})" 
        "(?P<field1>.{8})" 
        "(?P<field2>.{8})" 
        "(?P<field3>.{12})" 
        "(?P<field4>.{12})" 
        "(?P<field5>.{12})" 
        "(?P<field6>.{12})", line).groupdict() 
+0

Мне нравится подход re.match! Благодаря! –

0
line = line.split() 

может быть полезным.

+0

Это не сработает. –

1

вы можете сделать что-то вроде этого

In [2]: l = " 2/ 1/1961 0.0000 0.0019 --------- 0.749E+04 0.353E-02 0.374E-03" 

# this will eliminate the blank elements in the list 
In [3]: [x for x in l.split() if x] 
Out[3]: 
['2/', 
'1/1961', 
'0.0000', 
'0.0019', 
'---------', 
'0.749E+04', 
'0.353E-02', 
'0.374E-03'] 
2

Вы можете использовать функцию замены, чтобы избавиться от «/» из вашей строки, а затем применить раскол без Params, и это даст то, что вы хотите, я думаю. Попробуйте это:

with open("results_file.txt") as f: 
    x_date = [line.replace('/ ', '/').split() for line in f] 
+0

@ tao.hong приветствуется –

0

легко

L = "2/ 1/1961 0.0000 0.0019 --------- 0.749E+04 0.353E-02 0.3" 
N = [x for x in L.split()] 
print (N[3]) 

Выпуск N [3] составляет 0,0019, например:

0
import re 
f = open('results_file.txt', 'r') 

data = [ re.split(r'\s+', line, maxsplit=7) for line in f] 
for line in data: 
    print line 

Тогда вы получите вывод вроде:

>>> 
['2/', '1/1961', '0.0000', '0.0019', '---------', '0.749E+04', '0.353E-02', '0.374E-03\n'] 
['2/', '2/1961', '0.0000', '0.0021', '---------', '0.748E+04', '0.353E-02', '0.374E-03\n'] 
['2/', '3/1961', '0.0000', '0.0000', '---------', '0.743E+04', '0.350E-02', '0.371E-03\n'] 
['2/', '4/1961', '0.0000', '0.0000', '---------', '0.732E+04', '0.345E-02', '0.366E-03\n'] 
['2/', '5/1961', '24.0000', '24.0000', '0.416E-01', '0.719E+04', '0.339E-02', '0.360E-03\n'] 
['2/', '6/1961', '24.0000', '0.0000', '0.509E-01', '0.706E+04', '0.333E-02', '0.353E-03'] 
Смежные вопросы