чтение файла CSV без для

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

С тех пор для последней строки я получаю 'ПУСТОЙ байт' ошибка, которой я хотел бы избегать использования для ключевого слова, но в то время как.

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

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

Я хочу заменить для цикла с циклом с условием продолжения так, чтобы я мог проверить, является ли строка ПУСТОЙ или нет.

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

Спасибо

p. S. ниже traceback

Traceback (most recent call last):
  File "FetchNeuro_TodayTrades.py", line 189, in 
    for row in reader:
_csv.Error: line contains NULL byte
10
задан Abruzzo Forte e Gentile 11 February 2010 в 12:28
поделиться

7 ответов

Возможно, вы могли бы перехватить исключение, вызванное читателем 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
17
ответ дан 3 December 2019 в 16:29
поделиться

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

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

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

0
ответ дан 3 December 2019 в 16:29
поделиться

Если ваша проблема заключается в том, что последняя строка пуста, вы можете использовать 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
ответ дан 3 December 2019 в 16:29
поделиться

У меня нет ответа, но я могу подтвердить проблему, и что большинство опубликованных ответов не работают. Вы не можете поймать это исключение. Вы не можете проверить строку if. Возможно, вы могли бы проверить наличие 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
ответ дан 3 December 2019 в 16:29
поделиться

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

2
ответ дан 3 December 2019 в 16:29
поделиться

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

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

>>> 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-битным чистым; см. документы : "" "Кроме того, в настоящее время существуют некоторые проблемы, связанные с символами ASCII NUL." ""

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

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

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

4
ответ дан 3 December 2019 в 16:29
поделиться

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

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

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

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

1
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: