Python中tarfile.extract提取目录仅生成空文件夹问题求助
解决tarfile提取目录后文件丢失的问题
问题根源分析
你的代码存在三个核心问题:
- 对象比较错误:遍历tar包得到的
file是TarInfo对象,直接和字符串"myfile"比较永远不成立,若实际执行了提取操作,大概率是这段条件判断逻辑无效。 - 仅提取目录条目:
mytar.extract('home', "/tmp/myfolder")只会创建home目录本身,不会自动提取目录下的所有文件——因为tar包中目录和内部文件是独立存储的条目。 - 语法错误:
/tmp/myfolder未加引号,属于Python语法错误,实际运行会报错。
修正后的代码示例
场景1:直接提取home目录及其所有内容
for tar_path in tarfiles: with tarfile.open(tar_path) as mytar: # 过滤出home目录及所有子条目 home_entries = [entry for entry in mytar if entry.name == "home" or entry.name.startswith("home/")] mytar.extractall(path="/tmp/myfolder", members=home_entries)
场景2:确认存在myfile后再提取home目录
for tar_path in tarfiles: with tarfile.open(tar_path) as mytar: # 检查tar包中是否存在myfile has_target_file = any(entry.name == "myfile" for entry in mytar) if has_target_file: # 提取home目录及所有内容 home_entries = [entry for entry in mytar if entry.name == "home" or entry.name.startswith("home/")] mytar.extractall(path="/tmp/myfolder", members=home_entries)
关键注意事项
- 使用
extractall配合members参数批量提取目标条目,这是tar包提取目录及内容的标准方式。 - 遍历tar包时,必须通过
TarInfo.name属性获取文件/目录路径,不能直接将对象与字符串比较。 - 用
with语句管理tarfile对象,无需手动调用close(),避免资源泄漏。
内容的提问来源于stack exchange,提问作者Harpreet
相关产品推荐
相关产品推荐

