某些值是否会导致Python的csv.DictReader过早终止

时间:2015-03-12 18:10:43

标签: python csv

我有一个90,000行CSV文件,我试图用Python的csv阅读器进行解析,但我在脚本终止之前只获得了大约45行。我删除了除了一些行计数代码之外的所有内容,我还剩下以下内容:

import csv

with open('list.csv') as csvfile:
reader = csv.DictReader(csvfile)
headers = []
i = 1
for row in reader:
    print i
    if not headers:
        headers = list([x.lower() for x in row])
        i += 1
        continue
    i += 1

这准确地计算了我传递的虚拟CSV文件的行数,但不是真实行。是否存在可能导致DictReader终止的CVS文件中的值?

在这个实际尝试解析文件的脚本版本中,我必须在调用None等函数之前检查lower(),即使我期望所有内容都是字符串类型。这可能是相关的吗?

1 个答案:

答案 0 :(得分:0)

您需要以二进制模式打开文件。建议这样做有两个原因:

  • 在文字模式下,行分隔符会转换为\n规范形式,但在带有嵌入换行符的CSV列中,csv模块可以将这些与常规行结尾区分开来,因为CSV格式使用一个\n,另一个\r\n

  • 在文本模式下,Windows文件读取例程将0x1A substitute character视为文件结尾字符,并假装没有其他数据。

您的CSV文件几乎肯定包含这样一个字节,并且以二进制模式打开将允许您绕过Windows对该字节的错误处理:

with open('list.csv', 'rb') as csvfile:
    reader = csv.DictReader(csvfile)