Я должен прочитать файл 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
Возможно, вы могли бы перехватить исключение, вызванное читателем 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
не совсем понимаю, что вы имеете в виду, но вы всегда можете проверить наличие с помощью if
>>> reader = csv.reader("file")
>>> for r in reader:
... if r: print r
...
, если это не то, что вы хотите, вы должны более четко описать свою проблему, показывая примеры вещей, которые у вас не работают, включая формат файла образца и желаемый результат.
Если ваша проблема заключается в том, что последняя строка пуста, вы можете использовать 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')
У меня нет ответа, но я могу подтвердить проблему, и что большинство опубликованных ответов не работают. Вы не можете поймать это исключение. Вы не можете проверить строку 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
Сообщество Django рассматривало вопросы импорта CSV в Python, так что, возможно, стоит поискать CSV import там, или опубликовать вопрос. Кроме того, вы можете отредактировать ошибочную строку непосредственно в CSV-файле, прежде чем пытаться импортировать.
Вам нужно (всегда) ТОЧНО сказать, в чем заключается ошибка сообщение, которое вы получили. Пожалуйста, отредактируйте свой вопрос.
Вероятно, это:
>>> 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.
Вы можете попробовать очистить файл по мере его чтения:
def nonull(stream):
for line in stream:
yield line.replace('\x00', '')
f = open(filename)
reader = csv.reader(nonull(f))
При условии, конечно, что простое игнорирование символов NULL подойдет вам!