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

我想在 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 文档,loadarff需要一个类似文件的对象。根据zipfile 文档,open返回一个类似文件的ZipExtFile.


因此,我的问题是如何使用什么ZipFile.open作为 ARFF 输入返回到loadarff.


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


森栏
浏览 161回答 1
1回答

慕仙森

from io import BytesIO, TextIOWrapperfrom zipfile import ZipFilefrom scipy.io.arff import loadarffzfile = ZipFile('archive.zip', 'r')in_mem_fo = TextIOWrapper(BytesIO(zfile.read('datafile.arff')), encoding='utf-8')data = loadarff(in_mem_fo)读zfile入内存BytesIO对象。TextIOWrapper与 一起使用encoding='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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python