Python CSV阅读器没有以我期望的方式读取CSV数据

问题描述:

我试图将一些CSV数据读入数组。我大概可以解释什么,我想在Python比用英语做的更好:Python CSV阅读器没有以我期望的方式读取CSV数据

>>> line = ImportFile.objects.all().reverse()[0].file.split("\n")[0] 
>>> line 
'"007147","John Smith","100 Farley Ln","","Berlin NH 03570","Berlin","NH",2450000,"John",24643203,3454,"E","",2345071,1201,"N",15465,"I",.00,20102456,945610,20247320,1245712,"0T",.00100000,"",.00,.00,780,"D","000",.00,0\r' 
>>> s = cStringIO.StringIO() 
>>> s 
<cStringIO.StringO object at 0x9ab1960> 
>>> s.write(line) 
>>> r = csv.reader(s) 
>>> r 
<_csv.reader object at 0x9aa217c> 
>>> [line for line in r] 
[] 

正如你所看到的,CSV数据在内存中开始,而不是在一个文件中。我希望我的读者能够获得一些这样的数据,但事实并非如此。我究竟做错了什么?

您以错误的方式使用StringIO。尝试

s = cStringIO.StringIO(line) 
r = csv.reader(s) 
next(r) 
# "['007147', 'John Smith', '100 Farley Ln', '', 'Berlin NH 03570', 'Berlin', 'NH', '2450000', 'John', '24643203', '3454', 'E', '', '2345071', '1201', 'N', '15465', 'I', '.00', '20102456', '945610', '20247320', '1245712', '0T', '.00100000', '', '.00', '.00', '780', 'D', '000', '.00', '0']" 

结果应该是你的期望。

编辑:更详细地解释:写入StringIO实例后,文件指针将指向内容的结尾。这是您希望在随后的write()调用中写入新内容的地方。但这也意味着read()调用不会返回任何内容。您需要拨打s.reset()s.seek(0)将位置重置为起始位置,或使用所需内容初始化StringIO

+1

在这种情况下,这种方式*也*正确,但有时您需要读写StringIO对象;它被支持。 – 9000 2011-01-31 21:26:51

s.write(line)后面加上s.seek(0)。类文件对象s中的当前指针刚刚经过写入的行。