gpt4 book ai didi

python - 使用 zipfile 和 scipy.io.arff 从 ZIP 读取 ARFF

转载 作者:太空宇宙 更新时间:2023-11-03 21:08:33 24 4
gpt4 key购买 nike

我想在 scikit-learn 中处理相当大的 ARFF 文件。这些文件位于 zip 存档中,我不想在处理之前将存档解压到文件夹中。因此,我使用Python 3.6的zipfile模块:

from zipfile import ZipFile
from scipy.io.arff import loadarff

archive = ZipFile( 'archive.zip', 'r' )
datafile = archive.open( 'datafile.arff' )
data = loadarff( datafile )
# …
datafile.close()
archive.close()

但是,这会产生以下错误:

Traceback (most recent call last):
File "./m.py", line 6, in <module>
data = loadarff( datafile )
File "/usr/lib64/python3.6/site-packages/scipy/io/arff/arffread.py", line 541, in loadarff
return _loadarff(ofile)
File "/usr/lib64/python3.6/site-packages/scipy/io/arff/arffread.py", line 550, in _loadarff
rel, attr = read_header(ofile)
File "/usr/lib64/python3.6/site-packages/scipy/io/arff/arffread.py", line 323, in read_header
while r_comment.match(i):
TypeError: cannot use a string pattern on a bytes-like object

根据loadarff documentation , loadarff 需要一个类似文件的对象。根据zipfile documentation , open 返回类似文件的 ZipExtFile

因此,我的问题是如何使用 ZipFile.open 返回的内容作为 loadarff 的 ARFF 输入。

注意:如果我手动解压并直接使用 data = loadarff( 'datafile.arff' ) 加载 ARFF,一切都很好。

最佳答案

from io import BytesIO, TextIOWrapper
from zipfile import ZipFile
from scipy.io.arff import loadarff

zfile = ZipFile('archive.zip', 'r')
in_mem_fo = TextIOWrapper(BytesIO(zfile.read('datafile.arff')), encoding='utf-8')
data = loadarff(in_mem_fo)

zfile 读入内存中的 BytesIO 对象。将 TextIOWrapperencoding='utf-8' 结合使用。在 loadarff 中使用此内存缓冲文本对象。

编辑:原来 zfile.open() 返回一个类似文件的对象,因此上述操作可以通过以下方式完成:

zfile = ZipFile('archive.zip', 'r')
in_mem_fo = TextIOWrapper(zfile.open('datafile.arff'), encoding='ascii')
data = loadarff(in_mem_fo)

谢谢@Bernhard

关于python - 使用 zipfile 和 scipy.io.arff 从 ZIP 读取 ARFF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55235310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com