【问题标题】:Parsing CSV data from memory in Python在 Python 中从内存中解析 CSV 数据
【发布时间】:2023-04-03 10:09:01
【问题描述】:

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

(在数据进入数据库之前解析数据不是一个选项。)

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

【问题讨论】:

  • “我将 CSV 数据存储在我的数据库中,我想解析它。”这是模棱两可的。您是否将整个 CSV 文件作为 glob 或字符串存储在数据库中?您的意思是将所有信息片段存储在数据库中的一个表中,其中每一列对应一个 CSV 字段?
  • 我将整个文件存储为 BLOB。
  • BLOB 的结构是什么?您是否可以选择腌制数据?

标签: python csv


【解决方案1】:

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

【讨论】:

  • cStringIO 在大多数情况下更合适。
【解决方案2】:

这就是为什么你应该使用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) 更有可能让正在阅读您的代码的人不知道它的作用。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      csv.reader(csvfile)
      

      csvfile 可以是任何对象 支持迭代器协议和 每次 next() 时返回一个字符串 方法被调用——文件对象和 列表对象都适合。

      如果你有例如来自 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)
      

      【讨论】:

      • -1 因为您的答案是来自文档的简单 RTFM 引用,没有进一步解释为什么或如何有帮助。它没有回答 OP 问题
      • @Martin Thurau 添加示例(跳过 DB 部分,根据最新评论,文件内容本身保存在数据库中,而不是单行)
      • -1 用fromDB = '"Column\nheading1",hdng2\r\ndata1,data2\r\n'试试你的代码
      • @Howard:详情请看我的回答。
      • 我建议将其标记为答案,因为它最有可能“开箱即用”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2015-08-28
      • 2011-09-25
      • 2013-04-12
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      相关资源
      最近更新 更多