【发布时间】:2021-03-17 08:41:04
【问题描述】:
我有一个tarfile.TarFile,我想从中提取一些文件到修改后的目标文件名;有一个与存档成员同名的现有文件,我不想触碰。
具体来说,我想附加一个后缀,例如存档中名为 foo/bar.txt 的成员应提取为 foo/bar.txt.mysuffix。
这两种有些明显但又有些不令人满意的方法是:
- 使用
extractfile提取每个文件,创建重命名文件并使用shutil.copyfileobj复制内容;但是,这仅限于常规文件或所有特殊处理,例如在tarfile中实现的稀疏文件、符号链接、目录等必须被复制。 -
extractall到一个临时目录,然后重命名并复制到目标;这只是让人感到不必要的复杂,需要与主机系统进行更多交互并引入新的故障模式,而且似乎很容易犯这种微妙的错误(例如,请参阅shutil.copy/copy2上的警告)。
TarFile 上是否没有接口或钩子可以简洁而正确地实现这一点?
【问题讨论】:
-
您提到创建重命名文件并从提取的文件中复制内容,但我不明白仅在原地重命名提取的文件有什么问题?
-
对,对不起,这是一些缺失的上下文;原因是目标名称下有一个现有文件,我不想覆盖它。我会把这个添加到问题中。