Windows下Python解压含特殊名称文件夹的tar文件报错求助
Windows下Python解压含冒号目录的tar包报错解决办法
问题背景
在Windows上用Python的tarfile模块解压tar包时,包里有个叫127.0.0.1:8004的文件夹,手动解压系统会自动把冒号换成下划线127.0.0.1_8004,但用代码直接调用extractall()就会报错,提示目录名称无效——因为Windows不允许目录名里有冒号。
原代码:
import tarfile import os path= r'C:\temp\Temp' os.chdir(path) finalName= os.listdir(".")[0] finalName if finalName.endswith("tar"): tar = tarfile.open(finalName, "r:") tar.extractall() tar.close()
报错信息:
File ".\Test.py", line 14, in <module> tar.extractall() File "C:\Program Files\Python38\lib\tarfile.py", line 2024, in extractall self.extract(tarinfo, path, set_attrs=not tarinfo.isdir(), File "C:\Program Files\Python38\lib\tarfile.py", line 2065, in extract self._extract_member(tarinfo, os.path.join(path, tarinfo.name), File "C:\Program Files\Python38\lib\tarfile.py", line 2139, in _extract_member self.makedir(tarinfo, targetpath) File "C:\Program Files\Python38\lib\tarfile.py", line 2168, in makedir os.mkdir(targetpath, 0o700) NotADirectoryError: [WinError 267] 目录名称无效: '.\\measurements_18_Oct_2023_07h_46m_33s\\with_x6mt_no_roadrunner\\R8_First_Measurements\\127.0.0.1:8004'
解决代码
不要直接用extractall(),改成遍历每个文件/目录,把名称里的冒号替换成下划线再提取:
import tarfile import os path = r'C:\temp\Temp' os.chdir(path) finalName = os.listdir(".")[0] if finalName.endswith("tar"): # 用with语句自动处理文件关闭 with tarfile.open(finalName, "r:") as tar: for member in tar.getmembers(): # 替换所有冒号为下划线,适配Windows命名规则 member.name = member.name.replace(":", "_") tar.extract(member)
说明
with语句能自动管理tar文件的打开和关闭,比手动调用close()更稳妥- 遍历每个成员时修改名称,和手动解压的行为一致,避免Windows的命名限制报错
- 逐个提取修改后的成员,确保所有带非法字符的路径都被修正
内容的提问来源于stack exchange,提问作者RockyRib
相关产品推荐
相关产品推荐

