2013-08-10 2 views
4

У меня есть текстовый файл, содержащий данные моделирования (60 столбцов, 100k строк):Импорта данных и имена переменных из текстового файла в Python

a b c 
1 11 111 
2 22 222 
3 33 333 
4 44 444 

... где в первом ряду являются именами переменных, и ниже (в столбцах) - соответствующие данные (тип float).

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

print(b) 

Мне нужно получить значения из второго столбца.

Я знаю, как импортировать данные:

data=np.genfromtxt("1.txt", unpack=True, skiprows = 1) 

Присвоить переменные "вручную":

a,b,c=np.genfromtxt("1.txt", unpack=True, skiprows = 1) 

Но у меня возникают проблемы с получением имен переменных:

reader = csv.reader(open("1.txt", "rt")) 
for row in reader: 
    list.append(row) 
variables=(list[0]) 

Как могу ли я изменить этот код, чтобы получить все имена переменных из первой строки и назначить их импортированным массивам?

+0

Я не совсем следую этому последнему предложению. Вы спрашиваете, как использовать отдельные символы в первой строке в качестве имен переменных, которые затем удерживают каждый столбец? – andyg0808

+0

Да, мне нужно иметь имена переменных, взятые из ячеек в первой строке. Позже мне нужно умножить один столбец на другой или на уравнение и построить результаты/сохранить в файл. – Michal

ответ

1

Вместо того, чтобы пытаться присвоить имена, вы можете подумать об использовании associative array, который известен в Python как dict, для хранения ваших переменных и их значений.Код может выглядеть примерно так (заимствования свободно от csv docs):

import csv 
with open('1.txt', 'rt') as f: 
    reader = csv.reader(f, delimiter=' ', skipinitialspace=True) 

    lineData = list() 

    cols = next(reader) 
    print(cols) 

    for col in cols: 
    # Create a list in lineData for each column of data. 
    lineData.append(list()) 


    for line in reader: 
    for i in xrange(0, len(lineData)): 
     # Copy the data from the line into the correct columns. 
     lineData[i].append(line[i]) 

    data = dict() 

    for i in xrange(0, len(cols)): 
    # Create each key in the dict with the data in its column. 
    data[cols[i]] = lineData[i] 

print(data) 

data затем содержит каждый из ваших переменных, которые могут быть доступны через data['varname'].

Так, например, вы могли бы сделать data['a'], чтобы получить список ['1', '2', '3', '4'] с учетом ввода, предоставленного в ваш вопрос.

Я думаю, что попытка создания имен на основе данных в вашем документе может быть довольно неудобным способом сделать это по сравнению с методом на основе dict, показанным выше. Если вы действительно хотите это сделать, вы можете посмотреть на reflection в Python (тема, о которой я ничего не знаю).

2

Ответ: вы не хотите этого.

Словари предназначены именно для этой цели: структура данных вы фактически хотите будет что-то вроде:

data = { 
    "a": [1, 2, 3, 4], 
    "b": [11, 22, 33, 44], 
    "c": [111, 222, 333, 444], 
} 

... которые вы можете легко получить доступ с помощью, например, data["a"].

Это возможный делать то, что вы хотите, но обычный способ хак, который опирается на тот факт, что Python использует (барабанная дробь)dict внутри для хранения переменных - и так как ваш код не будет знать имена этих переменных, вы будете зависеть от использования доступа к словарю, чтобы получить от них также ... поэтому вы могли бы просто использовать словарь в первую очередь.

Стоит отметить, что это намеренно затруднены в Python, потому что если ваш код не знает имена своих переменных, они по данным определения, а не логике, и должны рассматриваться как таковые.

В случае, если вы не уверены в том же, вот хорошая статья на эту тему:

Stupid Python Ideas: Why you don't want to dynamically create variables

+0

«Словарь» работает хорошо! Этот метод подходит для больших файлов (например, 100-мегабайтный txt-файл с 50 тыс. Строк)? Что нужно сделать для умножения данных ["a"] * data ["b"] * function? – Michal

+0

Чтобы умножить элементы из списков в 'data', вы можете использовать, например. 'data [" a "] [0] * data [" a "] [0]'. Как правило, вы повторяете эти списки, а не получаете доступ к отдельному члену, но это действительно выходит за рамки этого вопроса и немного слишком сложно правильно объяснить в комментарии. –

+0

@Michal Опять же, эффективные способы обработки больших объемов данных выходят за рамки этого вопроса - если у вас есть новый вопрос, связанный с ответом на предыдущий, вы должны найти SO, чтобы узнать, уже ли он ответил, и если не спрашивайте его отдельно. –

0

Благодаря @ andyg0808 и @Zero Piraeus я нашел другое решение. Для меня наиболее подходящим является использование библиотеки анализа данных Pandas.

import pandas as pd 

    data=pd.read_csv("1.txt", 
      delim_whitespace=True, 
      skipinitialspace=True) 

    result=data["a"]*data["b"]*3 
    print(result) 

    0  33 
    1 132 
    2 297 
    3 528 

... где 0,1,2,3 - индекс строки.

0

Вот простой способ преобразования .txt-файла имен переменных и данных в массивы NumPy.

D = np.genfromtxt('1.txt',dtype='str') # load the data in as strings 
D_data = np.asarray(D[1::,:],dtype=float) # convert the data to floats 
D_names = D[0,:]       # save a list of the variable names 

for i in range(len(D_names)): 
    key = D_names[i]      # define the key for this variable 
    val = D_data[:,i]      # set the value for this variable 
    exec(key + '=val')     # build the variable code here 

Мне нравится этот метод, потому что его легко отслеживать и просты в обслуживании. Мы можем уплотнить этот код следующим образом:

D = np.genfromtxt('1.txt',dtype='str')  # load the data in as strings 
for i in range(D.shape[1]): 
    val = np.asarray(D[1::,i],dtype=float) # set the value for this variable 
    exec(D[0,i] + '=val')     # build the variable 

Оба кода сделать то же самое, вернуть Numpy массивы с именем а, б, со связанными с ними данными.