2016-04-27 2 views
1

Python новичок здесь.Импорт CSV в список списка Python

У меня есть файл CSV, содержащий номера в этом виде формата

9143.680696, 427953.500000, 11919.104475, 11908.727555, 1.000871, 0.029506, 15.546608, 93, 121, 123, 7 
7704.773182, 330297.500000, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93, 121, 123, 7 

мне нужно прочитать файл таким образом, что список будет идти, как этот

[ 
[[9143.680696, 427953.500000, 11919.104475, 11908.727555, 1.000871, 0.029506, 15.546608, 93, 121, 123], [7]], 
[[7704.773182, 330297.500000, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93, 121, 123], [7]] 
] 

последний номер каждой строки хранится в другом списке, например, в случае 7 здесь.

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

Заранее благодарю вас за помощь.


+0

Ожидаете ли вы последние четыре элемента каждой строки должны рассматриваться как Интс или поплавками (93 или 93.0)? – RafG

ответ

0

Самый простой подход безИспользование внешних модулей:

Update: Я заменил простые float(...) преобразования с новым convert(...) метод, который пытается произвести поплавок и возвращает исходную строку (или в качестве альтернативы может сделать что-то другое), вместо того, чтобы выбросить исключение, если маркер не является числом.

def convert(value_str): 
    try: # try to convert it to a float: 
     return float(value_str) 
    except ValueError: # if it is not a valid float literal, return the original string: 
     return value_str 

with open("file.csv") as csvfile: 
    split_lines = [line.split(",") for line in csvfile] 
    data = [[[convert(n) for n in line[:-1]], [convert(line[-1])]] for line in split_lines] 

    print(data) 

Выход для примера данных от вопроса (отформатирован вручную):

[ 
    [ [9143.680696, 427953.5, 11919.104475, 11908.727555, 1.000871, 0.029506, 15.546608, 93.0, 121.0, 123.0], [7.0] ], 
    [ [7704.773182, 330297.5, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93.0, 121.0, 123.0], [7.0] ] 
] 
+0

Принесли бы ошибки, если у меня есть значения в списке -nan? – ethanruan

+0

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

+0

@ethanruan Добавлена ​​функция convert(), которая обрабатывает случаи, когда токен не является допустимым числом с плавающей запятой. –

3

Вы можете попробовать, как это,

>>> csv = '''9143.680696, 427953.500000, 11919.104475, 11908.727555, 
1.000871, 0.029506, 15.546608, 93, 121, 123, 7 
7704.773182, 330297.500000, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93, 121, 123, 7''' 
>>> [[line.split(',')[0:-1], [line.split(',')[-1]]] for line in csv.splitlines()] 
[[['9143.680696', ' 427953.500000', ' 11919.104475', ' 11908.727555', ' 1.000871', ' 0.029506', ' 15.546608', ' 93', ' 121', ' 123'], [' 7']], [['7704.773182', ' 330297.500000', ' 19186.759308', ' 19170.146116', ' 1.000867', ' 0.029426', ' 14.302257', ' 93', ' 121', ' 123'], [' 7']]] 

Если вы хотите float элементов, вы можете использовать map,

>>> data = csv.splitlines() 
>>> data = [map(float, line.split(',')) for line in csv.splitlines()] 
>>> [[items[:-1], items[-1]] for items in data] 
[[[9143.680696, 427953.5, 11919.104475, 11908.727555, 1.000871, 0.029506, 15.546608, 93.0, 121.0, 123.0], 7.0], [[7704.773182, 330297.5, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93.0, 121.0, 123.0], 7.0]] 

Довольно печати:

>>> import pprint 
>>> pprint.pprint([[items[:-1], items[-1]] for items in data]) 
[[[9143.680696, 
    427953.5, 
    11919.104475, 
    11908.727555, 
    1.000871, 
    0.029506, 
    15.546608, 
    93.0, 
    121.0, 
    123.0], 
    7.0], 
[[7704.773182, 
    330297.5, 
    19186.759308, 
    19170.146116, 
    1.000867, 
    0.029426, 
    14.302257, 
    93.0, 
    121.0, 
    123.0], 
    7.0]] 
+0

Я думаю, что этанруан хочет сохранить десятичное число, поэтому добавьте конверсию? – Whysmerhill

+0

На Python 3 вам понадобится 'list (map (...))' или понимание списка. – RafG

+0

@Whysmerhill Я добавил решение. Спасибо –

0

Просто используйте [] оператор, чтобы получить левую и правую часть списка:

import csv 
... 
list = [] 
with open(filename, "rb") as fd: 
    reader = csv.reader(fd, delimiter = ",") 
    for row in reader: 
     left = list(map(lambda x: float(x), row[:-1])) 
     right = list(map(lambda x: float(x), row[-1:])) 
     list.append([ left, right ]) 
1

CSV libraries обычно чтения полей как строки, так что вам нужно будет преобразовать поля в явном виде. Из документации модуля csv:

Каждая строка, считанная из файла csv, возвращается в виде списка строк. No автоматический тип данных преобразование.

>>> import csv 
>>> with open('eggs.csv', 'rb') as csvfile: 
...  spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
...  for row in spamreader: 
...   <process row> 

Аналогично, библиотеки CSV будет обрабатывать все поля одинаково, так что вам нужно будет явно обернуть последнее поле в списке.

Например:

a = ["1.23", "2.34", "10", "100", "1000"] 

>>> map(float, a[0:2]) + map(int, a[2:4]) + [[int(a[4])]] 

[1.23, 2.34, 10, 100, [1000]] 
0

Вам нужно пройти по списку и преобразовывать их в целые числа. Также сохраните их в нужном формате списка.

пример:

import csv 
l = list() 
with open('data.csv', 'r') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 
    for row in reader: 
    l.append([[float(row[:-1])]+[float(row[-1])]]) 
print(l) 
0

вы можете попробовать это, рассмотреть имя входного файла в качестве input.csv

import csv 
new_list = [] 
with open('input.csv') as inp: 
    csv_reader = csv.reader(inp, delimiter=',') 
    for line in csv_reader: 
     new_list.append([map(float, line[:-1])] + [map(float, line[-1:])]) 

демо из IPython,

In [1]: import csv 

In [2]: new_list = [] 

In [3]: with open('input.csv') as inp: 
    ...:  csv_reader = csv.reader(inp, delimiter=',') 
    ...:  for line in csv_reader: 
    ...:   new_list.append([line[:-1]] + [line[-1:]]) 
    ...:   

In [4]: new_list 
Out[4]: 


    [[[9143.680696, 
    427953.5, 
    11919.104475, 
    11908.727555, 
    1.000871, 
    0.029506, 
    15.546608, 
    93.0, 
    121.0, 
    123.0], 
    [7.0]], 
[[7704.773182, 
    330297.5, 
    19186.759308, 
    19170.146116, 
    1.000867, 
    0.029426, 
    14.302257, 
    93.0, 
    121.0, 
    123.0], 
    [7.0]]] 
Смежные вопросы