2013-12-18 3 views
0

Со следующими данными, используя фрагмент кода, я получаю следующую ошибку. Не могли бы вы помочь мне в этом. Я новичок в питоне. данных:Чтение файла csv в python

"Id","Title","Body","Tags" 
"Id1","Tit,le1","Body1","Ta,gs1" 
"Id","Title","Body","Ta,2gs" 

Код:

#!/usr/bin/python 
import csv,sys 
if len(sys.argv) <> 3: 
print >>sys.stderr, 'Wrong number of arguments. This tool will print first n records from a comma separated CSV file.' 
print >>sys.stderr, 'Usage:' 
print >>sys.stderr, '  python', sys.argv[0], '<file> <number-of-lines>' 
sys.exit(1) 

fileName = sys.argv[1] 
n = int(sys.argv[2]) 

i = 0 
out = csv.writer(sys.stdout, delimiter=',', quotechar='"', quoting=csv.QUOTE_NONNUMERIC) 

ret = [] 


def read_csv(file_path, has_header = True): 
    with open(file_path) as f: 
     if has_header: f.readline() 
     data = [] 
     for line in f: 
      line = line.strip().split("\",\"") 
      data.append([x for x in line]) 
    return data 


ret = read_csv(fileName) 
target = [] 
train = [] 
target = [x[2] for x in ret] 
train = [x[1] for x in ret] 

Ошибка:

target = [x[2] for x in ret] 
IndexError: list index out of range 
+0

Созданный файл не более двух строк? –

+0

Извините, за ошибку в данных. Теперь я отредактировал этот вопрос. Спасибо @PauloBu – novieq

+0

В чем смысл [x для x в строке]? –

ответ

3

Вы смешиваете file.readline() и используя файловый объект в качестве итератора. Не делай этого. Вместо этого используйте next().

Вы также должны использовать модуль csv.reader(), чтобы читать свои данные, не изобретать изобретатель этого колеса. Модуль csv может обрабатывать кавычки значения CSV с разделителями, внедренных в thevalues ​​намного лучше в любом случае:

import csv 

def read_csv(file_path, has_header=True): 
    with open(file_path, 'rb') as f: 
     reader = csv.reader(f) 
     if has_header: next(reader, None) 
     return list(reader) 

Последнее, но не менее, вы можете использовать zip() транспонирования строк и столбцов:

ret = read_csv(fileName) 
target, train = zip(*ret)[1:3] # just the 2nd and 3rd columns 

Здесь zip() остановится в первой строке, где есть , а не достаточно столбцов, по крайней мере, избегая исключения, которое вы видите.

Если есть столбцы, отсутствующие в некоторых строках, используйте itertools.izip_longest() вместо (itertools.zip_longest() в Python 3):

from itertools import izip_longest 

ret = read_csv(fileName) 
target, train = izip_longest(*ret)[1:3] # just the 2nd and 3rd columns 

по умолчанию будет заменить недостающие столбцы с None; если вам нужно использовать другое значение, передать fillvalue аргумент izip_longest():

target, train = izip_longest(*ret, fillvalue=0)[1:3] # just the 2nd and 3rd columns 
+0

Спасибо @Martijin за это. Я получаю следующую ошибку: target, train = zip (* ret) [1: 2] ValueError: требуется больше 0 значений для распаковки – novieq

+0

@novieq: В этом случае ваш CSV-файл был пуст. Без столбцов для работы, 'zip()' возвращает пустой список. –

+0

Я использовал 'ret = read_csv (fileName) print (ret [0] [2]) print (ret [1] [2]) target, train = zip (* ret) [1: 2]' и I может видеть результат. Таким образом, csv правильно разбирается. Спасибо @Martijn заранее. – novieq

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