【问题标题】:Reading a csv (text) file with pkgutil.get_data使用 pkgutil.get_data 读取 csv(文本)文件
【发布时间】:2014-05-20 01:39:46
【问题描述】:

所以我正在编写一些代码,这些代码需要从与应用程序一起打包的 CSV 文件中提取配置/数据。据我了解,使用pkgutil 是执行此操作的“正确”方法。所以我想做的是:

import pkgutil
MatFile = pkgutil.get_data('impy.implosions', 'LILAC_Materials.csv')

它工作得很好,并给了我文件的字节。但我不知道如何以干净的方式将其输入csv.reader。我找到了这个old question,但它的解决方案类似于:

MatFile = io.StringIO(MatFile)
dataReader = csv.reader(MatFile , delimiter=',')

这不起作用,因为StringIO 需要一个str。 io 中的补充功能将是 BytesIO,但这对我没有帮助,因为 csv.reader 无法处理它。看起来这应该有一个简单的解决方案,但我不熟悉在 python 中处理字节数据。谢谢!

【问题讨论】:

    标签: csv python-3.x


    【解决方案1】:

    在 Python 3 中,csv 模块的类希望您向它们传递一个生成 Unicode 字符串的可迭代对象。如果您将数据作为单字节字符串,您首先需要对数据进行解码,然后将其分成几行。

    这里有一小段代码应该可以工作:

    MatFile = pkgutil.get_data('impy.implosions', 'LILAC_Materials.csv')
    dataReader = csv.reader(MatFile.decode('utf-8').splitlines(), delimiter=',')
    

    我猜该文件是用 UTF-8(或 ASCII,它是一个子集)编码的。如果您知道在 decode 调用中以其他方式交换适当的编码。 str.splitlines 负责将单个字符串分解为行列表,这完全可以作为csv.reader 的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 2018-05-24
      • 2015-06-12
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多