无需读取csv文件

时间:2010-02-11 10:06:50

标签: python csv

我需要在python中读取一个CSV文件。

因为对于最后一行,我收到一个'NULL byte'错误,我想避免使用for关键字但是while。

你知道怎么做吗?

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

我想用for循环替换for循环,以便我可以检查该行是否为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 个答案:

答案 0 :(得分:16)

也许您可以捕获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

答案 1 :(得分:3)

您需要(始终)确切地说明您收到的错误消息是什么。请编辑你的问题。

可能这个:

>>> 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阅读器。

答案 2 :(得分:1)

Django社区已经解决了Python CSV导入问题,因此可能值searching for CSV import或发布问题。此外,您可以在尝试导入之前直接在CSV文件中编辑违规行。

答案 3 :(得分:1)

如果您的问题特定于最后一行为空,您可以使用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')

答案 4 :(得分:1)

您可以在阅读时尝试清理文件:

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

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

当然,假设只是忽略NULL字符对你有用!

答案 5 :(得分:0)

不太确定你的意思,但你可以随时检查是否存在

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

如果这不是你想要的,你应该通过展示不适合你的事情的例子来更清楚地描述你的问题,包括样本文件格式和你想要的所需输出。

答案 6 :(得分:0)

我没有答案,但我可以确认问题,并且发布的大多数答案都不起作用。你不能抓住这个例外。您无法测试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

答案 7 :(得分:0)

处理初始csv文件并将Nul '\0'替换为空白,然后您就可以阅读它了。 实际代码如下所示:

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

它对我有用。

最初的答案在这里:csv-contain null byte