为什么Python的csvreader开始好,然后生成空字节?

好,所以我正在阅读一个Excel工作簿。 我读了一段时间的文件,它开始了.csv后debugging,并做了其他事情下面的代码我告诉你,它改变了一个xlsx我开始得到IOError没有这样的文件或目录。 我想出了为什么,并将FFA.csv更改为FFA.xlsx,它没有任何错误。 然后我开始做其他事情和debugging。 今天早上起床,现在我得到以下错误:行包含NULL字节。 奇怪,因为代码开始很好。 现在它无法阅读。 我把打印repr()进行debugging,它现在打印NULL字节。 那么,我如何解决这个问题,并在将来防止它呢? 这里是第一个200字节:

PK\x03\x04\x14\x00\x06\x00\x08\x00\x00\x00!\x00b\xee\x9dh^\x01\x00\x00\x90\x04\x00\x00\x13\x00\x08\x02[Content_Types].xml \xa2\x04\x02(\xa0\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

 import csv def readFile(): count = 0 print repr(open("FFA.xlsx", "rb").read(200)) #dump 1st 200 bytes with open("FFA.xlsx","rb") as csvfile: FFAreader = csv.reader(csvfile, delimiter=",") for row in FFAreader: idd = row[0] name = row[1] pos = row[2] team = row[3] pts = row[4] oecr = row[5] oR = row[6] posR = row[7] up = row[8] low =row[9] risk = row[10] swing = row[11] readFile() 

你发布的代码有一个小小的,但是很危险的错误,因为你打开它两次泄漏文件句柄。

1)打开文件并从中读取200个字节,但不能closures它。 2)然后你通过一个上下文pipe理器以正确的方式打开文件,这实际上可以从中读取任何内容。

有些问题可能会帮助您debugging问题:

  • 您打开的文件是否存储在networking资源中? (CIFS,NFS等)
  • 你检查过的文件是不是被另一个进程打开? LSF可以帮助你检查。
  • 这是运行在Windows或Linux? 你可以在Linux下testing,如果它发生在Windows中,反之亦然?

我忘了提及,即使文件似乎是CSV数据,也不应该使用CSV来处理与Excel有关的任何事情。 使用XLRD模块( https://pypi.python.org/pypi/xlrd ),它是跨平台的,从0.8版开始,XSL和XSLX文件的打开和读取都很完美。

这段代码将告诉你如何打开工作簿并以基本的方式parsing它:

 import xlrd def open_excel(): with xlrd.open_workbook('FFA.xlsx') as wb: sh = wb.sheet_by_name('Sheet1') for rownum in xrange(sh.nrows): [Do whatever you need here] 

我同意Marc的观点,我做了一个导入excel文件的训练练习,我觉得在这种情况下你可以将pandas导入为pd,并使用pd.read_excel(file_name)作为data_processing函数的一部分,比如read_file()import。

所以这就是我所做的。 但我在学习xlrd方法,我有模块,但没有文档。 这没有任何错误信息。 仍然不知道为什么它从.csv更改为xlsx,但现在它的工作。 xlrd中的脚本是什么?

 import csv def readFile(): count = 0 #print repr(open("FFA.csv", "rb").read(200)) #dump 1st 200 bytes check if null values produced. with open("FFA.csv","rb") as csvfile: FFAreader = csv.reader(csvfile, delimiter=",") for row in FFAreader: idd = row[0] name = row[1] pos = row[2] team = row[3] pts = row[4] oecr = row[5] oR = row[6] posR = row[7] up = row[8] low =row[9] risk = row[10] swing = row[11] readFile()