2010-06-16 92 views
3

我想读一个非常简单但在某种程度上使用python中的csv库的大型(800Mb)csv文件。分隔符是单个选项卡,每行包含一些数字。 每一行是一个记录,我有我的文件20681行。在使用此文件进行计算时,我遇到了一些问题,它总是停在某一行。我怀疑,在file.I使用下面的代码来算这个文件行的数目行数:阅读python中的csv文件的问题

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

hello hello ...如果你已经解决了你的问题,接受一个答案或写你自己的答案并接受它 - 否则你需要提供更多的信息,以便我们可以帮助你。 – 2010-06-18 00:40:31

+0

嗨,对不起,迟到的回复。问题是,它被保存在Unix格式。所以我没有选择安装Ubuntu并丢弃窗户。 Noe一切都很好。我使用vim,看到长行导致了这个问题 顺便说一句,感谢您的调试代码,它帮助了我很多。我选择它作为答案,如果有人有同样的问题可以使用它。 – Hossein 2010-06-18 15:04:39

+0

“问题在于它是以Unix格式保存的,所以我没有选择安装Ubuntu并丢掉Windows。” - “以Unix格式保存”不应该成为Python的问题;今后,在采取这种激烈行动之前,请考虑描述您的问题并寻求更多帮助。 – 2010-06-18 22:12:52

回答

2

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

61722行几乎是完全的3倍20681 - 是任何意义数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。

我会怀疑:

(一)你的文件有随机的垃圾或apppended它二进制0的一大块 - 这应该是显而易见的十六进制编辑器;它也应该在TEXT编辑器中显而易见。打印您所做的所有行,以帮助确定故障发生的位置。

或(b)分隔符是一个或多个空格字符(空格,制表符)的字符串,前几行有制表符,其余行有空格。如果是的话,这应该是一个十六进制编辑器明显(或记事本+ +,特别是如果你做View/Show Symbol/Show all characters)。如果是这种情况,你不能使用csv,你需要一些简单的东西:

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

我不愿意说“#NOT'rb'” – Arafangion 2010-06-17 00:00:47

0

我的第一个猜测将是分隔符。你如何确保分隔符是一个制表符? 什么是真正要传递的价值? (你的代码列出了一个空格,但我相信你打算通过别的东西)。

如果您的文件是制表符分隔的,那么请专门查找'\ t'作为您的分隔符。寻找一个空间会搞砸你的数据中不存在空格的情况,而不是列分隔符。

此外,如果您的文件是一个excel选项卡,那么有一个特殊的“方言”。

+0

我实际上是通过查看数据来说明的。我看到我的价值观之间有一个空间。 – Hossein 2010-06-16 21:41:49

+0

你如何看待你的数据?用十六进制编辑器或只是通过文本编辑器?文本编辑器可能无法正确显示选项卡。用notpad ++编写的 – Uri 2010-06-16 21:43:22

+0

。我使用了'\ t',但是在多行之后它给了我这个错误:Traceback(最近一次调用最后一次): 文件“C:\ Users \ Hossein \ Documents \ UvA Study Materials \ ECML \ Codes \ TFIDFMaker \ TFIDFgenerator.py” 43行,在 process_tf_idf() 文件 “C:\用户\侯赛因\文件\阿姆斯特丹大学的研究材料\ ECML \代码\ TFIDFMaker \ TFIDFgenerator.py”,第21行,在process_tf_idf 为行中tfdf_Reader: 错误:字段大于字段限制(131072) – Hossein 2010-06-16 21:45:44