如何提取.tar.gz内未知文件夹的.txt文件至指定目录根目录
解决.tar.gz解压时直接提取指定文件到目标目录的问题
你的代码现在会保留压缩包内的原始目录结构,所以.txt文件会被放到未知名称的子文件夹里。要直接把这些文件提取到my_path/extracted/根目录,我们可以通过读取文件内容后手动写入目标路径的方式来实现,这样能完全跳过原有的目录层级。
这里给你优化后的代码,同时做了一些安全性和严谨性的改进:
import os import tarfile # 用makedirs + exist_ok避免目录已存在时抛出异常 os.makedirs('extracted', exist_ok=True) # 使用with语句自动管理tar包的打开和关闭,更安全 with tarfile.open('xxx.tar.gz', 'r') as tar: for member in tar.getmembers(): # 确保是文件且后缀为.txt(避免误处理目录) if member.isfile() and member.name.endswith('.txt'): # 从完整路径中提取纯文件名,忽略前面的所有目录 filename = os.path.basename(member.name) # 拼接目标路径 dst_path = os.path.join('extracted', filename) # 读取压缩包内的文件内容,写入到目标路径 with tar.extractfile(member) as src_file, open(dst_path, 'wb') as dst_file: dst_file.write(src_file.read())
额外提示:处理文件名冲突
如果压缩包内有多个同名的.txt文件,上面的代码会直接覆盖旧文件。要是你想避免这种情况,可以加一个生成唯一文件名的逻辑:
def get_unique_save_path(dst_dir, original_filename): base_name, ext = os.path.splitext(original_filename) counter = 1 candidate_name = original_filename while os.path.exists(os.path.join(dst_dir, candidate_name)): candidate_name = f"{base_name}_{counter}{ext}" counter += 1 return os.path.join(dst_dir, candidate_name) # 把上面的dst_path替换成这个: dst_path = get_unique_save_path('extracted', filename)
这样就能保证每个.txt文件都能被保留,不会因为重名丢失内容~
内容的提问来源于stack exchange,提问作者Marta
相关产品推荐
相关产品推荐

