Windows系统使用shutil.make_archive创建压缩包报OSError问题
问题根因
你遇到的报错是Windows系统文件名非法字符限制导致的,和shutil.make_archive本身的功能无关:
- Windows操作系统的文件名/路径名中禁止使用
:(冒号)、<、>、"、/、\、|、?、*这些字符,而你生成的压缩包文件名里包含了时间字符串中的:(2021-08-26 17:44:34.189488里的三个冒号) - Linux系统允许冒号出现在文件名中,所以你的代码在Linux环境可以正常运行
- 你误以为路径合法是因为只校验了路径的层级结构,没注意到文件名片段包含Windows禁止的特殊字符
修复方案
只需要在生成文件名的时候把时间字符串里的冒号替换为Windows允许的字符即可,比如替换为横杠、下划线:
# 把execution_datetime中的冒号替换为下划线 safe_datetime_str = str(execution_datetime).replace(':', '_') archived_output_path = os.path.join(archive_dir_path, f'outputs_{safe_datetime_str}') shutil.make_archive(archived_output_path, 'zip', output_dir_path)
替换后生成的文件名为outputs_2021-08-26 17_44_34.189488.zip,符合Windows文件名规范,即可正常创建压缩包。
内容的提问来源于stack exchange,提问作者EnzoMolion
相关产品推荐
相关产品推荐

