You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:05:34