Python CSV阅读器不是';t以我期望的方式读取CSV数据

Python CSV阅读器不是';t以我期望的方式读取CSV数据,python,django,csv,Python,Django,Csv,我正在尝试将一些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

我正在尝试将一些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]
[]
>>line=ImportFile.objects.all().reverse()[0].file.split(“\n”)[0]
>>>线
“007147”、“John Smith”、“100 Farley Ln”、“Berlin NH 03570”、“Berlin”、“NH”、“2450000”、“John”、“24643203454”、“E”、“23450711201”、“N”、“15465”、“I”、“0.002014569461002473201245712”、“0T”、“0.00100000”、“0.00780”、“D”、“000”、“0.00,0\r”
>>>s=cStringIO.StringIO()
>>>
>>>s.write(行)
>>>r=csv.读卡器
>>>r
>>>[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']"
结果应该是你所期望的

Edit:更详细地解释:写入
StringIO
实例后,文件指针将指向内容的末尾。这就是您希望通过后续的
write()
调用写入新内容的地方。但这也意味着
read()
调用不会返回任何内容。您需要调用
s.reset()
s.seek(0)
将位置重置到开头,或使用所需内容初始化
StringIO

s.write(line)
之后添加
s.seek(0)
。像对象
s
这样的文件中的当前指针刚刚超过写入的行。

这种方式在这种情况下也是正确的,但有时您需要同时读取和写入StringIO对象;它是受支持的。