2016-06-16 5 views
1

Я пытаюсь заставить свою программу читать infile и отображать ее на графике. Он работал, когда входной_файл содержал только один элемент в каждой строке, но в этом новом файле, есть несколько элементов в одной строке:Чтение предметов с несколькими пунктами в одной строке

Линия 1: -4.6653184e-01 -3.9003953e-01 -1.3689525e + 00 -2,9784036e-01 -1,2366933e + 00 -1,4433164e + 00 -1,7245383e + 00 -2,2787106e + 00 -9.8088629e-01 -1.9053069e + 00 -1.7806724e + 00 -3.1259933e + 00 -2.1796645e + 00 -1.8323782e + 00 -1.9089487e + 00 -3.6322765e + 00

Line 2: -8.9710621e-01 -6.2431759e-01 -1.4762999e + 00 -2.2668609e-01 -1.6593426e + 00 -1,5644687 e + 00 -2,4312715e + 00 -2,8894224e + 00 -1,7810424e + 00 -2,2357098e + 00 -2,8545336e + 00 -3,7422563e + 00 -3.0884226e + 00 -2.9146711e + 00 -3.3407812e + 00 -5.2601065 e + 00

я был в состоянии сделать это раньше с

линии = infile.readlines()

в то время как в цикле, но теперь я не знаю, куда идти отсюда. Я довольно новичок в python, и я был бы признателен за помощь.

Также обратите внимание, что существует около 35 000 строк, и я не могу просто войти в текстовый файл и «войти» после каждой записи. Спасибо!

+0

Вы можете использовать sed для достижения «ввода» после каждой строки: sed s// \ n/g

ответ

0

Это потому, что .readlines() делает именно это; он будет принимать все значения, которые он находит в одной строке, и добавить их в свой список как один элемент. Вместо этого в каждой из ваших строк вам нужен дополнительный шаг, который отделяет каждое число в строке на основе разделителя. Для этого мы можем использовать .split() и указать разделитель как пустую строку (которая совпадает с одним пробелом).

output_to_plot = [] 

with open('multi_items.txt', 'r') as infile: 
    for line in infile: 
     output_to_plot.extend([float(item) for item in line.split(' ')]) 

print(output_to_plot) 
0

Это зависит от того, что вы хотите сделать. Из строки вы вставили, если вы хотите, чтобы выбрать все значения как одного набора данных вы могли бы заменить, что вы с:

lines = [] 
[lines.extend(_.split()) for _ in fd.readlines()] 
print lines 

Это даст вам одно значение позиции массива:

['-4.6653184e-01', '-3.9003953e-01', '-1.3689525e+00', '-2.9784036e-01', '-1.2366933e+00', '-1.4433164e+00', '-1.7245383e+00', '-2.2787106e+00', '-9.8088629e-01', '-1.9053069e+00', '-1.7806724e+00', '-3.1259933e+00', '-2.1796645e+00', '-1.8323782e+00', '-1.9089487e+00', '-3.6322765e+00', '-8.9710621e-01', '-6.2431759e-01', '-1.4762999e+00', '-2.2668609e-01', '-1.6593426e+00', '-1.5644687e+00', '-2.4312715e+00', '-2.8894224e+00', '-1.7810424e+00', '-2.2357098e+00', '-2.8545336e+00', '-3.7422563e+00', '-3.0884226e+00', '-2.9146711e+00', '-3.3407812e+00', '-5.2601065e+00'] 

Если вы хотите, чтобы создать матрицу данных, в которой каждый столбец представляет собой отдельный набор данных, то вы заменяете ваш readlines с:

lines = [_.split() for _ in fd.readlines() 

, который будет генерировать (в вашем примере) матрица из двух строк и N столбцов, таких как:

[['-4.6653184e-01', '-3.9003953e-01', '-1.3689525e+00', '-2.9784036e-01', '-1.2366933e+00', '-1.4433164e+00', '-1.7245383e+00', '-2.2787106e+00', '-9.8088629e-01', '-1.9053069e+00', '-1.7806724e+00', '-3.1259933e+00', '-2.1796645e+00', '-1.8323782e+00', '-1.9089487e+00', '-3.6322765e+00'], 
['-8.9710621e-01', '-6.2431759e-01', '-1.4762999e+00', '-2.2668609e-01', '-1.6593426e+00', '-1.5644687e+00', '-2.4312715e+00', '-2.8894224e+00', '-1.7810424e+00', '-2.2357098e+00', '-2.8545336e+00', '-3.7422563e+00', '-3.0884226e+00', '-2.9146711e+00', '-3.3407812e+00', '-5.2601065e+00']] 
0

Если все значения разделяются пробелами, вы можете просто использовать

for line in lines: 
    items = line.split() 

Если они разделены чем-то другим, используйте line.split(separator). Это разделит строку при каждом возникновении separator (если не будет выделен разделитель, он будет разделен после последовательного пробела) и вернет список элементов, которые вы затем можете обработать.

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