我想在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
需要一个类似文件的对象。
根据{{3}},open
返回类似ZipExtFile
的文件。
因此,我的问题是如何使用ZipFile.open
返回的内容作为loadarff
的ARFF输入。
注意:如果我手动解压缩并用data = loadarff( 'datafile.arff' )
直接加载ARFF,一切都很好。
答案 0 :(得分:0)
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
对象。将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)
感谢@Bernhard