You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python递归遍历tarball内所有文件(无需解压)

如何在不解压的情况下遍历tarball中所有目录的文件?

你的示例代码其实已经走对了方向,tarfile.getmembers()会返回tar包内的所有成员,包括子目录里的文件,根本不需要单独处理目录分支——目录本身不是文件,直接跳过就行,只处理文件类型的成员即可。

修改后的完整代码

import tarfile

with tarfile.open("sample.tar") as tar_file:
    # 遍历tar包内的所有成员
    for member in tar_file.getmembers():
        # 只处理文件(排除目录、符号链接等非文件类型)
        if member.isfile():
            # 打印文件完整路径,方便区分来源目录
            print(f"=== 读取文件: {member.name} ===")
            # 读取文件内容
            content = tar_file.extractfile(member).read()
            # 文本文件解码成字符串输出,二进制文件显示字节长度
            try:
                print(content.decode('utf-8'))
            except UnicodeDecodeError:
                print(f"这是二进制文件,总字节数: {len(content)}")

代码说明

  • member.name会返回文件的完整路径(比如Documents/file1.txt、Pictures/image1.jpg),不管它在哪个子目录下;
  • extractfile(member)可以直接通过成员对象访问对应文件的内容,不需要手动遍历目录结构;
  • 额外加了编码判断,避免图片这类二进制文件解码报错。

可选:只读取指定目录下的文件

如果不需要遍历所有文件,只想读取Documents和Pictures下的内容,可以加路径过滤:

import tarfile

# 指定要读取的目标目录(注意末尾的斜杠,避免匹配到同名前缀的文件)
target_dirs = ("Documents/", "Pictures/")

with tarfile.open("sample.tar") as tar_file:
    for member in tar_file.getmembers():
        # 只处理目标目录下的文件
        if member.isfile() and member.name.startswith(target_dirs):
            print(f"=== 读取目标文件: {member.name} ===")
            content = tar_file.extractfile(member).read()
            # 根据文件类型处理内容...

内容的提问来源于stack exchange,提问作者Dang Huy Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:03:20