我正在尝试将一些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数据从内存开始,而不是在文件中。我希望我的读者可以获得一些数据,但事实并非如此。我做错了什么?
答案 0 :(得分:5)
您以错误的方式使用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 :(得分:0)
在s.seek(0)
之后添加s.write(line)
。类似文件的对象s
中的当前指针刚好超过了写入的行。