使用shutil复制文件触发OSError[Errno22]的问题排查
问题分析与解决
你遇到的OSError: [Errno 22] Invalid argument报错,核心原因大概率是目标文件名中存在隐藏的不可见控制字符,或是路径处理时的编码/规范化问题——虽然手动复制能成功,但Python对文件路径的字符校验更严格。
排查与解决步骤
1. 确认目标目录存在
先确保new_files目录已创建,避免额外干扰:
import os if not os.path.isdir("new_files"): os.makedirs("new_files")
2. 检查文件名中的隐藏字符
用repr()函数打印目标路径的原始字符串,能暴露肉眼看不到的控制字符(比如零宽空格、非打印ASCII字符):
dst_path = "new_files/обзор кассационной практики судебной коллегии по уголовным делам верховного суда российской федерации за первое полугодие 2010 года от от 13 октября 2010 г..pdf" print(repr(dst_path))
如果输出中出现\u200b(零宽空格)、\x00(空字符)这类转义序列,说明文件名存在隐藏非法字符。
3. 清理文件名中的控制字符
用正则表达式过滤所有非打印的控制字符:
import re import shutil src_path = "data/Обзор кассационной практики Судебной коллегии по уголовным делам Верховного Суда Российской Федерации за первое полугодие 2010 год.pdf" dst_path = "new_files/обзор кассационной практики судебной коллегии по уголовным делам верховного суда российской федерации за первое полугодие 2010 года от от 13 октября 2010 г..pdf" # 过滤非打印控制字符 clean_dst = re.sub(r'[\x00-\x1f\x7f-\x9f]', '', dst_path) shutil.copy(src_path, clean_dst)
4. 规范化路径格式
如果是路径格式问题,用os.path.normpath()处理多余分隔符或点:
import os import shutil clean_dst = os.path.normpath(dst_path) shutil.copy(src_path, clean_dst)
补充说明
手动复制能成功是因为操作系统文件管理器会自动忽略或兼容某些控制字符,但Python的文件操作API对路径字符合法性校验更严格,因此触发Invalid argument错误。
内容的提问来源于stack exchange,提问作者user24958090
相关产品推荐
相关产品推荐

