tarfile.extractall() (Python 2.7) 的 Unicode 问题

Unicode issues with tarfile.extractall() (Python 2.7)

我在 Windows 上使用 python 2.7.6,我正在使用 tarfile 模块将文件提取为 gzip 文件。 tarfile.open()mode 选项设置为 "r:gz"。在打开调用之后,如果我要通过 tarfile.list() 打印存档的内容,我会在列表中看到以下目录:

./静态分析 Part 1.v1/

但是,在我调用 tarfile.extractall() 之后,我在提取的文件列表中没有看到上述目录,而是看到了这个:

é™æ€åˆ†æž Part 1.v1/

如果我通过 7zip 解压缩存档,我会看到一个与上面第一项同名的目录。所以,很明显,extractall() 方法搞砸了,但我不知道如何解决这个问题。

我了解到 tar 不会将编码信息保留为存档的一部分,并将文件名视为原始字节序列。因此,我从 tarfile.extractall() 看到的输出只是压缩前包含文件名的原始字符序列。为了获得 extractall() 方法来重新创建原始文件名,我发现您必须在调用 extractall() 之前手动将 TarFile 对象的 members 转换为适当的编码.在我的例子中,以下方法起到了作用:

  modeltar = tarfile.open(zippath, mode="r:gz")
  updatedMembers = []
  for m in modeltar.getmembers():
    m.name = unicode(m.name, 'utf-8')
    updatedMembers.append(m)
  modeltar.extractall(members=updatedMembers, path=dbpath)

以上代码基于超级用户的回答:https://superuser.com/a/190786/354642