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

Jas*_*ett 3 python csv django

我正在尝试将一些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]
[]
Run Code Online (Sandbox Code Playgroud)

如您所见,CSV数据从内存开始,而不是在文件中.我希望我的读者可以获得一些数据,但事实并非如此.我究竟做错了什么?

Sve*_*ach 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']"
Run Code Online (Sandbox Code Playgroud)

结果应该是你所期望的.

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