前情提要:最近工作中需要用到两百多个tar.gz压缩包中的几个文件,本来写了一个程序想着直接解压,然后把需要的文件复制过来,但光两百多个压缩包就5个T,每个压缩包基本都是20多G,光是解压一个压缩包就要20min左右,而且解压那么多,我就只需要用到那么几个文件,实在是太不划算了,于是我就上网搜索,相关资源真的很少,最后还得是gpt告诉我写个python脚本就ok。所以实操之后我就列出下面这么两种方法:第一个是如果你不需要批量化处理,只是手上有一个很大的压缩包,需要提取到其中的几个文件,那么你可以参考方法一;第二个是如果你需要批量化提取压缩包中的一些文件,人工不仅麻烦,还容易出错,那么就交给代码,可以参考方法二。另外,我是在Windows11环境下操作的,不过python脚本在Linux环境下稍作修改也是适用的。
方法一:文件资源管理器双击+复制(很简单但很有效,同样适用于zip等其他格式的压缩包)
以我的这个27.9G的tar.gz压缩包为例,
①打开文件资源管理器,找到文件位置,直接双击压缩包;
②等待几分钟,我这个大概等了三四分钟,就读取到了压缩包的具体内容;
③接着就可以像普通文件夹一样点击,直接找到需要的文件,右键复制,粘贴到想要的位置(这个过程可能也需要等待个一两分钟),完成!
参考文章在这里:
方法二:python脚本批量化处理
为了方便理解使用,我这里用了一个tar.gz压缩包作为示例,提取了其中三个我需要的文件,需要提取多个压缩包中一些格式类似的文件的话加一个for循环就好。那么直接上代码,由于是tar.gz压缩包,需要引入tarfile库,如果是zip格式的压缩包,需要zipfile库,稍作修改相应的函数即可适用。
import tarfile
import os
#### 指定要解压的文件夹和目标路径 ####
tar_dir = 'H:/CHCP_ScienceDB/CHCP_ScienceDB_preproc/3001.tar.gz'
# tar_dir:待提取的tar.gz压缩包路径(最好是绝对路径)和文件名
target_path = 'G:/3001/'
# target_path:目标路径,提取到的文件期望放置的位置
extract_files = ['tfMRI_Emotion','tfMRI_Gambling','tfMRI_Language']
# extract_files:待提取的文件,本demo中需要从压缩包中提取3个文件
if not os.path.exists(target_path):
os.makedirs(target_path) # 创建target_path
# 打开.tar.gz
with tarfile.open(tar_dir, 'r:gz') as tar_ref:
found = False # 标志变量
all_task = extract_files[:] # 注意这里不能直接赋值
for member in tar_ref.getmembers(): # 遍历压缩包中的每个文件
num_find = 0
for task in all_task:
target_file = 'MNINonLinear/Results/' + task + '/' + task + '_hp200_s2_level2.feat/3001_' + task + '_level2_zstat_hp200_s2.dscalar.nii'
# target_file:要提取的文件名,如果是在解压后文件夹的子文件夹中,路径从压缩包后一级写相对路径即可
if member.name == target_file:
tar_ref.extract(member, path=target_path) # 一旦找到就提取文件
print(f'{target_file} 已解压至 {target_path}')
del all_task[num_find] # 提取过之后删掉该文件,避免重复提取,提高效率
break
num_find += 1
if len(all_task) == 0: # 如果待提取文件全部找到,更改标志变量
found = True
break
if not found:
print(f'{target_file} 未提取完全')
运行后等待几分钟,完成文件提取,下面是运行结果(打印提示信息有点中文乱码,大家忽略),用了差不多五分钟完成了三个文件的提取,和方法一速度差不多,但人工批量化处理容易出错且麻烦,代码自动处理效率高且方便。
以上两种方法就是我找到的目前比较有效的不解压压缩包就能提取到文件的方式,当然了,适用于压缩包比较大或者比较多不方便一个个解压的情况, 欢迎批评指正~~~如果大家还有其他比较高效方便的方法,欢迎一起交流~~~