Я хочу обрабатывать довольно большие файлы ARFF в scikit-learn. Файлы находятся в zip архиве и я не хочу распаковывать архив в папку перед обработкой. Следовательно, я использую модуль zipfile Python 3.6:
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
требуется файлоподобный объект. Согласно документации по zip-файлу, open
возвращает файл ZipExtFile
.
Следовательно, мой вопрос заключается в том, как использовать то, что ZipFile.open
возвращает в качестве ввода ARFF для loadarff
.
Примечание. Если я разархивирую вручную и загружу ARFF напрямую с помощью data = loadarff( 'datafile.arff' )
, все будет в порядке.
in_mem_fo = StringIO(archive.read('datafile.arff'))
- person Nihal Sangeeth   schedule 19.03.2019in_mem_fo = StringIO(archive.read('datafile.arff').decode("utf-8"))
илиin_mem_fo = StringIO(archive.read('datafile.arff').decode("ascii"))
- person Bernhard Bodenstorfer   schedule 19.03.2019