在Python中从内存解析CSV数据
有没有办法在Python中解析CSV数据,尤其是当这些数据不在文件里的时候?我把CSV数据存储在数据库里,想要解析它。我在找类似于Ruby的CSV.parse
的东西。我知道Python有一个CSV
类,但我在文档中看到的内容似乎都是处理文件,而不是内存中的CSV数据。
(而且在数据放进数据库之前解析数据也不是一个选项。)
(请不要告诉我不要把CSV数据存储在数据库里。我对数据库的操作是有把握的。)
4 个回答
2
http://docs.python.org/library/csv.html
csv.reader(csvfile)
csvfile可以是任何支持迭代器协议的对象,也就是说每次调用它的next()方法时都会返回一个字符串——文件对象和列表对象都可以用。
如果你有比如从数据库中获取的内容存储在一个字符串里,你可以像这样解析它:
import csv
fromDB = "1,2,3\n4,5,6"
reader = csv.reader(fromDB.split("\n"))
for row in reader:
print("New row")
for col in row:
print(" ", col)
3
这里有个理由告诉你为什么应该使用 cStringIO.StringIO
(在 Python 3.x 中是 io.StringIO
),而不是自己搞一些复杂的东西:
>>> import csv
>>> from cStringIO import StringIO
>>> fromDB = '"Column\nheading1",hdng2\r\n"data1\rfoo","data2\r\nfoo"\r\n'
>>> sources = [StringIO(fromDB), fromDB.splitlines(True),
... fromDB.splitlines(), fromDB.split("\n")]
>>> for i, source in enumerate(sources):
... print i, list(csv.reader(source))
...
0 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK
1 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK
2 [['Columnheading1', 'hdng2'], ['data1foo', 'data2foo']] # 3 errors
3 [['Columnheading1', 'hdng2'], ['data1\rfoo', 'data2\rfoo'], []] # 3 errors
>>>
使用 guff.splitlines(True)
并不推荐,因为它比 StringIO(guff)
更容易让看你代码的人搞不清楚它到底在干嘛。