2015-06-07 3 views
1

У меня есть CSV-файл, который имеет несколько строк числовых строк значений следующего формата:Считывание строк числовых строк в отдельные списки в Python

CSV образец 2 строки:

[['ASA00211063', '2005'], [-0.434358, -0.793407, -1.070576, nan, nan,...(365 values)], [0.354615, -0.108102,nan,...(365 values)]]

[['AFR02516075', '1998'], [-0.434358, -0.7934039, -1.0705767, nan, nan,...(365 values)], [0.3546153, -0.1081022, nan,...(365 values)]]

Как я могу расколоть, а также присоединиться к CSV-файл в списки, например, что из пут:

list[0] = ['ASA00211063', '2005'], ['AFR02516075', '1998']... 
list[1] = [-0.434358, -0.793407, -1.070576, nan, nan,..., 0.354615, -0.108102,nan,...(**730** values)] 
list[2] = [-0.434358, -0.7934039, -1.0705767, nan, nan,..., 0.3546153, -0.1081022, nan,...(**730** values)] 
+0

делает CSV содержат '[[' и ']]' символы? –

+0

Да, у него есть символы [[и]] и обрабатываются как строки – ASG

ответ

0

Я думаю, что я доволен вашим требованиям с этим кодом:

#!/usr/bin/python 

import re 

data = [[]] 

for line in open('in'): 
    line = line.strip() 
    line = re.match(r'\[?(.*)\]', line).group(1) 

    res = re.split(r', (?=\[)', line) 

    data[0].append(res[0]) 
    string = res[1] + res[2] 
    data.append([string]) 

for i, v in enumerate(data): 
    print("{}\n".format(data[i])) 

Вход:

[['ASA00211063', '2005'], [-0.434358, -0.793407, -1.070576, nan, nan,...(365 values)], [0.354615, -0.108102,nan,...(365 values)]] 
[['AFR02516075', '1998'], [-0.434358, -0.7934039, -1.0705767, nan, nan,...(365 values)], [0.3546153, -0.1081022, nan,...(365 values)]] 
[['XXX02516075', '1998'], [-1.434358, -1.7934039, -1.1705767, nan, nan,...(365 values)], [0.7546153, -0.7081022, nan,...(365 values)]] 

Выход:

data[0]: 
["['ASA00211063', '2005']", "['AFR02516075', '1998']", "['XXX02516075', '1998']"] 

data[1]: 
['[-0.434358, -0.793407, -1.070576, nan, nan,...(365 values)][0.354615, -0.108102,nan,...(365 values)]'] 

data[2]: 
['[-0.434358, -0.7934039, -1.0705767, nan, nan,...(365 values)][0.3546153, -0.1081022, nan,...(365 values)]'] 

data[3]: 
['[-1.434358, -1.7934039, -1.1705767, nan, nan,...(365 values)][0.7546153, -0.7081022, nan,...(365 values)]'] 
+0

Спасибо @Stevieb. Я попробую этот фрагмент кода, чтобы узнать, как лучше использовать регулярное выражение, поскольку я боролся с ними. Большое спасибо – ASG

0

Чтобы прочитать вещую структуру из текстового файла всегда использовать ast.literal_eval() он будет читать только в питон структур и не позволяет кому-либо вставлять что-либо неприятное во входной файл.

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

import ast 

l = [] 
for line in open('inputfile.txt'): 
    edited_line = line.replace('nan','"nan"') 
    l.append(ast.literal_eval(edited_line)) 

Это будет также заменить все nan с numpy.nan объектов:

import ast 
from numpy import nan 

l = [] 
for line in open('inputfile.txt'): 
    edited_line = line.replace('nan','"nan"') 
    edited_line = ast.literal_eval(edited_line) 
    edited_line = [[nan if v == 'nan' else v for v in vals] for vals in edited_line] 
    l.append(edited_line) 

# combine elements [1] and [2] in the sublist to a list of len = 730 
# element l[0] is list of ['code', 'yyyy'] 
# element l[1 ... n] is list of data by row of length 730 
l = [[subl[0] for subl in l]] + [subl[1]+subl[2] for subl in l] 

дает выход:

for row in l: print row 
>>> [['ASA00211063', '2005'], ['AFR02516075', '1998']] 
    [-0.434358, -0.793407, -1.070576, nan, nan, 0.354615, -0.108102, nan] 
    [-0.434358, -0.7934039, -1.0705767, nan, nan, 0.3546153, -0.1081022, nan] 
+0

Спасибо за ваше внимание. Я получаю следующий TypeError. любой дополнительной ответственности. ТипError: literal_eval() принимает ровно 1 аргумент (0 задано) – ASG

+0

@ASG Попробуйте сейчас ... –

+0

Еще раз спасибо. Да, я получаю «ValueError: неправильная строка», и я подозревал, что это может быть наном в моих строках. – ASG

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