所以我正在编写一些需要从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中处理字节数据。谢谢!
答案 0 :(得分:2)
在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
的输入。