使用 pkgutil.get_data 读取 csv(文本)文件

Ale*_*x Z 3 csv python-3.x

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

import pkgutil
MatFile = pkgutil.get_data('impy.implosions', 'LILAC_Materials.csv')
Run Code Online (Sandbox Code Playgroud)

它工作正常并给了我文件的字节。但我不知道如何以csv.reader一种干净的方式将其输入。我发现了这个老问题,但它的解决方案是这样的:

MatFile = io.StringIO(MatFile)
dataReader = csv.reader(MatFile , delimiter=',')
Run Code Online (Sandbox Code Playgroud)

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

Blc*_*ght 6

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

这是一些应该可以工作的快速代码:

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

我猜这个文件是用 UTF-8(或 ASCII,它是一个子集)编码的。如果您知道否则在decode调用中交换适当的编码。str.splitlines负责将单个字符串分解为行列表,这对于csv.reader.