使用pkgutil.get_数据读取csv(文本)文件

使用pkgutil.get_数据读取csv(文本)文件,csv,python-3.x,Csv,Python 3.x,因此,我正在编写一些代码,需要从CSV文件中提取配置/数据,这些文件与应用程序打包在一起。据我所知,使用pkgutil是一种“正确”的方法。所以我想做的是: import pkgutil MatFile = pkgutil.get_data('impy.implosions', 'LILAC_Materials.csv') 它工作正常,并提供文件的字节。但我不知道如何以一种干净的方式将其输入到csv.reader。我发现了这一点,但其解决方案如下: MatFile = io.StringIO(

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

import pkgutil
MatFile = pkgutil.get_data('impy.implosions', 'LILAC_Materials.csv')
它工作正常,并提供文件的字节。但我不知道如何以一种干净的方式将其输入到
csv.reader
。我发现了这一点,但其解决方案如下:

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

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

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

下面是一段快速运行的代码:

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
的输入