Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用zipfile和scipy.io.ARFF从ZIP读取ARFF_Python_Scikit Learn_Scipy_Zipfile_Arff - Fatal编程技术网

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

Python 使用zipfile和scipy.io.ARFF从ZIP读取ARFF,python,scikit-learn,scipy,zipfile,arff,Python,Scikit Learn,Scipy,Zipfile,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 = loadar

我想在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
回溯(最近一次呼叫最后一次):
文件“/m.py”,第6行,在
data=loadarff(数据文件)
loadarff中的文件“/usr/lib64/python3.6/site packages/scipy/io/arff/arffread.py”,第541行
返回_loadarff(ofile)
文件“/usr/lib64/python3.6/site packages/scipy/io/arff/arffread.py”,第550行,在加载arff中
rel,attr=读取头文件(ofile)
文件“/usr/lib64/python3.6/site packages/scipy/io/arff/arffread.py”,第323行,在read_头中
而r_comment.match(i):
TypeError:无法在类似字节的对象上使用字符串模式
根据,
loadarff
需要一个类似文件的对象。 根据,
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
对象。将
TextIOWrapper
encoding='utf-8'
一起使用。在
loadarff
中使用此内存缓冲文本对象

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

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

谢谢@Bernhard

loadarff需要一个类似文件的对象。所以您应该读入内存中的文件,比如对象。你能试试这个吗
in_mem_fo=StringIO(archive.read('datafile.arff'))
这会产生错误:文件“m.py”,第7行,in_mem_fo=StringIO(archive.read('datafile.arff'))类型错误:初始值必须是str或None,而不是bytes。但是让我找到一个解决方案:
in_mem_fo=StringIO(archive.read('datafile.arff').decode('utf-8'))
in_mem_fo=StringIO(archive.read('datafile.arff')。decode('ascii'))
太好了。我添加了一个可能是更好的解决方案的答案。再次感谢您的答案,您的答案启发我找到了另一个更优雅的解决方案,因为它避免了先将所有内容放入内存:
textfile=TextIOWrapper(datafile,encoding='ascii')
,然后
data=loadarff(textfile)
。我建议你在你的解决方案中加入类似的内容作为编辑,我接受,这样其他人就可以使用它了。