在python中读取csv文件的问题

时间:2010-06-16 21:37:33

标签: python

我正在尝试使用python中的csv库读取一个非常简单但不知何故的大(800Mb)csv文件。分隔符是单个选项卡,每行包含一些数字。 每行都是一条记录,我的文件中有20681行。在使用此文件进行计算期间,我遇到了一些问题,它始终停在某一行。我怀疑文件中的行数。我使用下面的代码来计算此文件中的行数:

tfdf_Reader = csv.reader(open('v2-host_tfdf_en.txt'),delimiter=' ')
c = 0
for row in tfdf_Reader:
  c = c + 1
print c

令我惊讶的是,c打印的值为61722!为什么会这样?我做错了什么?

2 个答案:

答案 0 :(得分:2)

文件中的800万字节和20681行意味着平均行大小超过38个千字节。您确定吗?你期望在每一行中有多少个数字?你怎么知道你有20681行?该文件是800 Mb?

61722行几乎正好是20681的3倍 - 是任何有意义的数字3,例如每条记录的3个逻辑子部分?

要了解文件中的真实内容,请不要依赖它的外观。 Python的repr()函数是你的朋友。

你在Windows上吗?即使不是,也总是open(filename, 'rb')

如果这些字段是以制表符分隔的,则不要放delimeter=" "(引号之间的任何内容都不是标签)。放delimiter="\t"

尝试在代码中添加一些调试语句,如下所示:

DEBUG = True
f = open('v2-host_tfdf_en.txt', 'rb')
if DEBUG:
    rawdata = f.read(200)
    f.seek(0)
    print 'rawdata', repr(rawdata)
    # what is the delimiter between fields? between rows?
tfdf_Reader = csv.reader(f,delimiter=' ')
c = 0
for row in tfdf_Reader:
    c = c + 1
    if DEBUG and c <= 10:
        print "row", c, repr(row)
        # Are you getting rows like you expect?
print "rowcount", c

注意:如果您收到Error: field larger than field limit (131072),则表示您的文件包含128Kb的数据且没有分隔符。

我怀疑:

(a)你的文件有随机垃圾或者大量的二进制零数据 - 这在十六进制编辑器中应该是显而易见的;它也应该在TEXT编辑器中显而易见。打印您所获得的所有行,以帮助确定问题的开始位置。

或(b)分隔符是一个包含一个或多个空格字符(空格,制表符)的字符串,前几行有制表符,其余行有空格。如果是这样,这应该在十六进制编辑器中显而易见(或者在Notepad ++中,特别是如果你View/Show Symbol/Show all characters)。如果是这种情况,则无法使用csv,您需要一些简单的内容:

f = open('v2-host_tfdf_en.txt', 'r') # NOT 'rb'
rows = [line.split() for line in f]

答案 1 :(得分:0)

我的第一个猜测就是分界线。你如何确保分隔符是一个标签? 你传递的实际价值是多少? (您的代码列出了一个空格,但我确定您打算传递其他内容)。

如果您的文件是制表符分隔的,那么请专门查看'\ t'作为您的分隔符。寻找空间会弄乱数据中有空间而非列分隔符的情况。

另外,如果你的文件是excel-tab,那么就有一个特殊的“方言”。