不使用for读取csv文件

12 投票
8 回答
18773 浏览
提问于 2025-04-15 19:08

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

因为在最后一行我遇到了'NULL字节'的错误,所以我想避免使用for关键字,而是用while。

你知道怎么做吗?

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

我想用while循环替代for循环,这样我就可以检查这一行是否是NULL。

在CSV模块中,读取单行的函数是什么?谢谢

谢谢

附注:下面是错误追踪信息

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

8 个回答

2

Django社区已经解决了Python在导入CSV文件时的一些问题,所以你可以去那里搜索一下关于CSV导入的内容,或者直接发个问题问问。此外,你也可以在尝试导入之前,直接在CSV文件中修改出错的那一行。

4

你需要(总是)准确地告诉我们你遇到的错误信息。请修改一下你的问题。

可能是这个:

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

20

也许你可以捕捉到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

撰写回答