2012-02-27 3 views
3

Я новичок в python и пытаюсь понять это весь день. У меня нет файл данных выложил, как показано ниже,Разделение столбцов файлов данных на отдельные массивы в Python

time I(R_stkb) 

Step Information: Temp=0 (Run: 1/11) 

0.000000000000000e+000 0.000000e+000 

9.999999960041972e-012 8.924141e-012 

1.999999992008394e-011 9.623148e-012 

3.999999984016789e-011 6.154220e-012 

(Примечания: Не пустой строки между каждой строкой данных.)

Я хочу построить данные с помощью функции Matplotlib, поэтому я нужен две отдельные столбцы в массивах.

я в настоящее время

def plotdata(): 

Xvals=[], Yvals=[] 
i = open(file,'r') 

for line in i: 
    Xvals,Yvals = line.split(' ', 1) 

print Xvals,Yvals 

Но очевидно, что его совершенно неправильно. Может ли кто-нибудь дать мне простой ответ на это, и с объяснением того, что именно означают линии, было бы полезно. Приветствия.

Редактировать: первые две строки повторяются по всему файлу.

ответ

5

Это работа для оператора * по методу zip.

>>> asdf 
[[1, 2], [3, 4], [5, 6]] 


>>> zip(*asdf) 
[(1, 3, 5), (2, 4, 6)] 

Таким образом, в контексте данных может быть что-то вроде:

handle = open(file,'r') 
lines = [line.split() for line in handle if line[:4] not in ('time', 'Step')] 
Xvals, Yvals = zip(*lines) 

или, если вы действительно должны быть в состоянии мутировать данные впоследствии можно просто вызвать list конструктор на каждом кортеже :

Xvals, Yvals = [list(block) for block in zip(*lines)] 
+0

Оператор splat не является частью функции 'zip' ... В противном случае это приятное решение. –

+1

Это не работает: '.split()' - это строковый метод, а строки - список строк. Вам нужно 'Xvals, Yvals = zip (* (строка.split() для строки в строках)) 'или что-то. – DSM

+0

Я получаю синтаксическую ошибку invaild, связанную с строкой «Xvals, Yvals = zip (* (lines.split())». Я использую python 3.2, если это что-то меняет. –

2

Один из способов сделать это:

Xvals=[]; Yvals=[] 
i = open(file,'r') 

for line in i: 
    x, y = line.split(' ', 1) 
    Xvals.append(float(x)) 
    Yvals.append(float(y)) 

print Xvals,Yvals 

Обратите внимание на вызов функции float, которая изменит строку, которую вы получаете из файла на несколько.

+0

Я получаю сообщение об ошибке «ValueError: требуется больше, чем 0 значений для распаковки» для первой строки (Xvals = [], Yvals = []) –

+0

К сожалению: первая строка должна быть 'Xvals = []; Yvals = [] '(или две отдельные строки) –

+0

@David: Sooo, почему бы вам не изменить его? –

1

Это numpy.loadtxt предназначено для. Попробуйте:

import numpy as np 
import matplotlib.pyplot as plt 

data = np.loadtxt(file, skiprows = 2) # assuming you have time and step information on 2 separate lines 
             # and you do not want to read them 
plt.plot(data[:,0], data[:,1]) 
plt.show() 

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

l = open(fname, 'rb').read() 
for chunk in l.split('time'): 
    data = np.array([s.split() for s in chunk.split('\n')[2:]][:-1], dtype = np.float) 
    plt.plot(data[:,0], data[:,1]) 
    plt.show() 

Или же вы можете добавить # комментарий знак комментария линий и использовать np.loadxt.

+0

Извините, я отредактировал мой вопрос, информация о временном шаге происходит позже в файле, так что это не будет выполняться, так как оно бросает ошибку с плавающей точкой на строку при ее удалении. –

+0

О, я вижу. , –

0

Если вы хотите построить этот файл с помощью matplotlib, вы можете проверить его функцию plotfile. См. Официальную документацию here.

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