如何用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
相关产品推荐
相关产品推荐

