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

发布于 2024-10-15 02:07:16 字数 233 浏览 2 评论 0原文

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

(并且在数据进入数据库之前不能解析数据。)

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

Is there a way to parse CSV data in Python when the data is not in a file? I'm storing CSV data in my database and I'd like to parse it. I'm looking for something analogous to Ruby's CSV.parse. I know Python has a CSV class but everything I've seen in the docs seems to deal with files as opposed to in-memory CSV data.

(And it's not an option to parse the data before it goes into the database.)

(And please don't tell me not to store the CSV data in the database. I know what I'm doing as far as the database goes.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

可爱咩 2024-10-22 02:07:16

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

There is no special distinction for files about the python csv module. You can use StringIO to wrap your strings as file-like objects.

墟烟 2024-10-22 02:07:16

这就是为什么你应该使用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)<不推荐使用 /code>,因为它比 StringIO(guff) 更有可能导致任何阅读你代码的人都不知道它的作用。

Here is why you should use cStringIO.StringIO (io.StringIO in Python 3.x) instead of some DIY kludge:

>>> 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
>>>

Using guff.splitlines(True) is not recommended as it has a far greater chance than StringIO(guff) that whoever is reading your code will not have a clue what it does.

世界如花海般美丽 2024-10-22 02:07:16

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)

http://docs.python.org/library/csv.html

csv.reader(csvfile)

csvfile can be any object which
supports the iterator protocol and
returns a string each time its next()
method is called — file objects and
list objects are both suitable.

If you have e.g. the content from DB in a string you can parse it like

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)
汐鸠 2024-10-22 02:07:16

使用 stringio 模块,它允许您将字符串装饰为类似文件的对象。这样您就可以将 stringio “文件”传递给 CSV 模块进行解析(或您可能使用的任何其他解析器)。

Use the stringio module, which allows you to dress strings as file-like objects. That way you can pass a stringio "file" to the CSV module for parsing (or any other parser you may be using).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文