我正在尝试使用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!为什么会这样?我做错了什么?
答案 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,那么就有一个特殊的“方言”。