[英]Python CSV reader isn't reading CSV data the way I expect
我正在尝试将一些CSV数据读入数组。 我可以解释一下我在Python中要做的比用英语做得更好:
>>> 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
。
在s.write(line)
之后添加s.seek(0)
s.write(line)
。 类文件对象中s
当前指针刚刚超过写入行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.