【发布时间】:2019-08-09 15:28:09
【问题描述】:
我想在 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,一切都很好。
【问题讨论】:
-
loadarff 需要一个类似文件的对象。所以你应该读入一个内存文件,比如 object.你能试试这个吗?
in_mem_fo = StringIO(archive.read('datafile.arff')) -
这会产生错误:文件“m.py”,第 7 行,在
in_mem_fo = StringIO(archive.read('datafile.arff')) TypeError: initial_value must be str or None ,而不是字节 -
但你的想法让我找到了解决方案:
in_mem_fo = StringIO(archive.read('datafile.arff').decode("utf-8"))或in_mem_fo = StringIO(archive.read('datafile.arff').decode("ascii")) -
太棒了。我添加了一个可能是更好的解决方案的答案。
标签: python scikit-learn scipy zipfile arff