访问 .zip 存档中的文件而不提取它们

Posted

技术标签:

【中文标题】访问 .zip 存档中的文件而不提取它们【英文标题】:Accessing files inside a .zip archive without extracting them 【发布时间】:2018-01-26 05:58:08 【问题描述】:

我正在尝试读取 .zip 中的 NIFTI 文件,而无需将目录解压缩到根目录。更具体地说,我正在使用 ADNI 数据库,文件按 subjectID 存储在单独的 .zip 文件中。在 .zip 文件中包含与该主题相关的所有数据,我想从 .zip 中提取 NIFTI 文件(.nii.gz)而不提取文件。

目前我有以下代码sn-p

def openNIFTI(filename):
   return nib.load(filename).get_data()

zip_filename = filepath + str(subject_id) + '_3T_Structural_unproc.zip'
filename = str(subject_id) + '/unprocessed/3T/T1w_MPR1/' + str(subject_id) + '_3T_T1w_MPR1.nii.gz'

file = zf.extract(filename)
data = openNIFTI(file)

filepath 是 .zip 文件集合的路径。 filename 是 .zip 文件中我要提取的 NIFTI 文件的路径。


(编辑)

似乎错误来自 nibabel 加载功能。然后功能检查

if not op.exists(filename):

在独立测试 os.path.exists(filename) 函数后,我发现了这一点。

os.path.exists(r'C:/Users/eee/workspace_python/Image Reconstruction/data/ADNI/MRI data/100206_3T_Structural_unproc.zip/100206/unprocessed/3T/T1w_MPR1/100206_3T_T1w_MPR1.nii.gz')

错误

但是,此路径是从我尝试打开的文件中复制/粘贴的。在我看来,错误是由于文件路径中的 .zip 而出现的,因为

os.path.exists(r'C:/Users/eee/workspace_python/Image Reconstruction/data/ADNI/MRI data/100206_3T_Structural_unproc.zip')

是的

还有其他方法吗?

【问题讨论】:

【参考方案1】:

请参阅python: Open file from zip without temporary extracting it 的已接受答案,这显示了如何在不提取文件的情况下从 zip 文件中读取数据(当然,您需要足够的 RAM 来处理文件内容)。

【讨论】:

我已经尝试过这个答案。我应该指定问题的主要目的是因为我正在使用 nibabel 加载 NIFTI 文件。 经过进一步检查,似乎 nibabel 检查了 os.path.exists(filename),这似乎在路径包含 .zip 时标记了错误。你知道解决这个问题的任何方法吗?

以上是关于访问 .zip 存档中的文件而不提取它们的主要内容,如果未能解决你的问题,请参考以下文章

`unzip -l` 时提取 zip 存档中的文件名列表

以数组形式组织的 PHP Zip 存档

在 Java 中提取存档文件 [关闭]

PHP Zip:提取目录的内容

从 zip 存档中提取单个文件

将 .zip 存档解压缩到 .jar 文件