python - 使用 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' )
,一切都很好。
解决方案
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
.
编辑: Turnsoutzfile.open()
返回一个类似文件的对象,因此可以通过以下方式完成上述操作:
zfile = ZipFile('archive.zip', 'r')
in_mem_fo = TextIOWrapper(zfile.open('datafile.arff'), encoding='ascii')
data = loadarff(in_mem_fo)
谢谢@伯恩哈德
推荐阅读
- android - 从 firebase 删除数据后无法使用 google 和 facebook 登录
- sql-server - SQL Server 2018 Management Studio - 在屏幕上显示所有打开的查询窗口
- fiware - 我的电子邮件 ID 可以订阅 Orion
- angular - Angular 6 Material Nested Tree 不适用于动态数据
- node.js - Node js 延迟响应问题(api 响应慢)
- jquery - 我可以将 jqgrid 与 JSON Web 令牌一起使用吗?
- ssis - 说明:由于包没有有效的 XML 格式,无法将包加载为 XML
- angular - 一旦应用程序关闭并打开,除非我移至下一页,否则不会显示离子滑块图像
- android - Oreo 仅在 FCM 中播放默认通知
- angular - 如何从视图容器角度删除特定视图