python:tarfile提取错误IOError:[Errno 22]无效模式(';wb';)或文件名

python:tarfile提取错误IOError:[Errno 22]无效模式(';wb';)或文件名,python,tarfile,Python,Tarfile,我正在使用tarfile提取一个文件。不幸的是,此压缩文件来自linux服务器,并且包含多个包含非法Windows OS字符的文件(“:”) 我正在使用以下命令: extract = tarfile.open(file) extract.extractall(path=new_path) extract.close() 我得到以下错误: IOError:[Errno 22]无效的模式('wb')或文件名:。。。“文件::ext” 因此,我尝试通过以下方式传递错误: try: extra

我正在使用tarfile提取一个文件。不幸的是,此压缩文件来自linux服务器,并且包含多个包含非法Windows OS字符的文件(“:”)

我正在使用以下命令:

extract = tarfile.open(file)
extract.extractall(path=new_path)
extract.close()
我得到以下错误: IOError:[Errno 22]无效的模式('wb')或文件名:。。。“文件::ext”

因此,我尝试通过以下方式传递错误:

try:
    extract = tarfile.open(file)
    extract.extractall(path=new_path)
    extract.close()
except IOError:
    pass
这确实有效,但是提取不会继续。它只是随着这次失败而停止

当我使用WinRAR提取归档文件时,该文件会自动重命名为“file_uuext”

python是否有WinRAR扩展?或者是一种跳过错误并继续提取的方法?或者像WinRAR那样自动重命名文件。我不介意是否跳过该文件


我看到几个帖子出现了这个错误,但是所有帖子都是用于压缩而不是提取的。

如果主要目标是批处理这些作业,您可以从命令行调用winRAR:

导入子流程
subprocess.call(['winRAR.exe','x','file.rar','PathToExtractTo'],shell=True)

我还没有测试上面的代码,但希望它能提供一些想法

extract = tarfile.open(file)
for f in extract:
    # add other unsavory characters in the brackets
    f.name = re.sub(r'[:]', '_', f.name)
extract.extractall(path=new_path)
extract.close()

(更改不会保存到原始文件b/c默认情况下,我们将以读取模式打开它。)

您的文件名是否包含冒号?压缩文件本身,否。文件中有一些文件,是。由于我无法确定的原因,您的答案不起作用。然而,它确实引导我找到了正确的解决方法,因此我将其标记为解决方案。我最终使用了字符串库中的maketrans()和f.name=f.name.translate(),而不是正则表达式。谢谢古怪的我在Python2和Python3中测试了它。不过,很高兴你找到了解决方案!