在Python中解析内存中的CSV数据

在Python中解析内存中的CSV数据,python,csv,Python,Csv,当数据不在文件中时,有没有办法在Python中解析CSV数据?我正在数据库中存储CSV数据,我想对其进行解析。我正在寻找类似Ruby的CSV.parse的东西。我知道Python有一个CSV类,但我在文档中看到的一切似乎都是处理文件,而不是内存中的CSV数据 (而且,在数据进入数据库之前,不能对其进行解析。) (请不要告诉我不要将CSV数据存储在数据库中。就数据库而言,我知道我在做什么。)使用stringio模块,该模块允许您将字符串设置为类似文件的对象。通过这种方式,您可以将一个stringi

当数据不在文件中时,有没有办法在Python中解析CSV数据?我正在数据库中存储CSV数据,我想对其进行解析。我正在寻找类似Ruby的
CSV.parse
的东西。我知道Python有一个
CSV
类,但我在文档中看到的一切似乎都是处理文件,而不是内存中的CSV数据

(而且,在数据进入数据库之前,不能对其进行解析。)


(请不要告诉我不要将CSV数据存储在数据库中。就数据库而言,我知道我在做什么。)

使用
stringio
模块,该模块允许您将字符串设置为类似文件的对象。通过这种方式,您可以将一个
stringio
“文件”传递给CSV模块进行解析(或您可能正在使用的任何其他解析器)。

关于python模块的文件没有特殊的区别。您可以使用将字符串包装为类似文件的对象。

csvfile可以是 支持迭代器协议和 每次返回下一个()时返回一个字符串 方法称为-file对象和 列表对象都是合适的

例如,如果您有一个字符串中的DB内容,您可以像

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)

这就是为什么您应该使用
cStringIO.StringIO
(Python 3.x中的
io.StringIO
)而不是一些DIY的乱七八糟的东西:

>>> 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)
有更大的可能性,无论谁读你的代码都不知道它是干什么的。

“我正在数据库中存储CSV数据,我想解析它。”这是不明确的。您是否将整个CSV文件作为全局文件或字符串存储在数据库中?您的意思是将所有信息存储在数据库的一个表中,每个列对应一个CSV字段吗?我将整个文件存储为一个BLOB。BLOB的结构是什么?您是否可以选择对数据进行pickle处理?在大多数情况下更合适。-1因为您的答案是来自文档的简单RTFM报价,没有进一步解释为什么或如何有帮助。而且它不回答这个问题question@MartinThurau添加了示例(跳过DB部分,根据最新的注释,文件内容本身保存在数据库中,而不是单行)-1使用
fromDB='“Column\nheading1”,hdng2\r\nda1,data2\r\n'
@Howard:有关详细信息,请参阅我的答案。我建议将此标记为答案,因为它最有可能“开箱即用”
>>> 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
>>>