在Python中从内存解析CSV数据

7 投票
4 回答
6617 浏览
提问于 2025-04-16 10:57

有没有办法在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) 更容易让看你代码的人搞不清楚它到底在干嘛。

9

关于Python的csv模块,文件没有什么特别的区别。你可以使用StringIO来把你的字符串包装成像文件一样的对象。

撰写回答