чтение файла CSV без для - PullRequest
9 голосов
/ 11 февраля 2010

Мне нужно прочитать файл CSV в Python.

Поскольку в последней строке я получаю сообщение об ошибке «NULL byte», я хотел бы не использовать ключевое слово for, но while.

Ты знаешь, как это сделать?

    reader = csv.reader( file )
    for row in reader  # I have an error at this line
          # do whatever with row

Я хочу заменить цикл for циклом while, чтобы я мог проверить, равна ли строка NULL или нет.

Какая функция для чтения одной строки в модуле CSV? Спасибо

Спасибо

p.S. ниже трассировки

Traceback (most recent call last):
  File "FetchNeuro_TodayTrades.py", line 189, in 
    for row in reader:
_csv.Error: line contains NULL byte

Ответы [ 8 ]

16 голосов
/ 11 февраля 2010

Может быть, вы могли бы поймать исключение, выдвинутое читателем CSV. Примерно так:

filename = "my.csv"
reader = csv.reader(open(filename))
try:
    for row in reader:
        print 'Row read with success!', row
except csv.Error, e:
    sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

Или вы можете использовать next():

while True:
    try: 
        print reader.next()
    except csv.Error:
        print "Error"
    except StopIteration:
        print "Iteration End"
        break
3 голосов
/ 11 февраля 2010

Вам необходимо (всегда) точно сказать, что за сообщение об ошибке вы получили. Пожалуйста, отредактируйте ваш вопрос.

Вероятно, это:

>>> import csv; csv.reader("\x00").next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
_csv.Error: line contains NULL byte
>>>

Модуль CSV не является 8-битным чистым; см. the docs : "" "Кроме того, в настоящее время есть некоторые проблемы, касающиеся символов ASCII NUL." ""

Сообщение об ошибке само по себе является ошибкой: оно должно быть "NUL", а не "NULL": - (

Если последняя строка в файле пуста, вы не получите исключение, вы просто получите row == [].

Предполагая, что проблема заключается в одном или нескольких NUL в ваших файлах, вам необходимо (1) серьезно поговорить с создателем (ями) вашего файла (ов) (2), если это не удалось, прочитать весь файл в (mode = "rb") удалите NUL и передайте fixed_text.splitlines() в считыватель csv.

1 голос
/ 15 марта 2010

Вы можете попробовать очистить файл, прочитав его:

def nonull(stream):
    for line in stream:
        yield line.replace('\x00', '')

f = open(filename)
reader = csv.reader(nonull(f))

Предполагая, конечно, что простое игнорирование NULL символов будет работать для вас!

1 голос
/ 11 февраля 2010

Если ваша проблема связана с тем, что последняя строка пуста, вы можете использовать numpy.genfromtxt (или старый matplotlib.mlab.csv2rec)

$: cat >csv_file.txt
foo,bar,baz
yes,no,0
x,y,z



$:
$: ipython
>>> from numpy import genfromtxt
>>> genfromtxt("csv_file.txt", dtype=None, delimiter=',')
array([['foo', 'bar', 'baz'],
       ['yes', 'no', '0'],
       ['x', 'y', 'z']], 
      dtype='|S3')
1 голос
/ 11 февраля 2010

Сообщество Django решило проблемы импорта из Python CSV, поэтому может стоить найти там CSV import или опубликовать вопрос. Кроме того, перед попыткой импорта вы можете отредактировать некорректную строку непосредственно в файле CSV.

0 голосов
/ 16 января 2013

Обработайте исходный файл csv и замените Nul '\0' пустым, а затем вы сможете прочитать его. Фактический код выглядит так:

data_initial = open(csv_file, "rU")
reader = csv.reader((line.replace('\0','') for line in data_initial))

У меня это работает.

И оригинальный ответ здесь: csv-содержит нулевой байт

0 голосов
/ 11 февраля 2010

У меня нет ответа, но я могу подтвердить проблему, и большинство опубликованных ответов не работают. Вы не можете поймать это исключение. Вы не можете проверить на if line. Возможно, вы могли бы проверить наличие байта NULL напрямую, но я не достаточно быстр, чтобы сделать это ... Если он всегда находится на последней строке, вы, конечно, можете пропустить это.

import csv
FH = open('data.csv','wb')
line1 = [97,44,98,44,99,10]
line2 = [100,44,101,44,102,10]
for n in line1 + line2:
    FH.write(chr(n))
FH.write(chr(0))
FH.close()
FH = open('data.csv')
reader = csv.reader(FH)
for line in reader:
    if '\0' in line:  continue
    if not line:  continue
    print line

$ python script.py 
['a', 'b', 'c']
['d', 'e', 'f']
Traceback (most recent call last):
  File "script.py", line 11, in <module>
    for line in reader:
_csv.Error: line contains NULL byte
0 голосов
/ 11 февраля 2010

не совсем уверен, что вы имеете в виду, но вы всегда можете проверить существование, если

>>> reader = csv.reader("file")
>>> for r  in reader:
...   if r: print r
...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...