Python处理文件名中的非英文字符与空格问题(Windows环境)
解决Windows下Python保存含特殊字符文件名的问题
问题根源
- 无效文件名字符:Windows系统禁止文件名包含
< > : " / \ | ? *这类字符,你目标文件名里的?是触发OSError: [Errno 22]的直接原因。 - 错误的写入模式:你下载的是MP4二进制文件,却使用文本模式
"w"写入,即便文件名问题解决,也会导致文件损坏无法正常播放。
修正后的代码
from urllib.request import urlopen from urllib import request from urllib.parse import unquote import os def sanitize_filename(filename): # 定义Windows不允许的文件名字符集合 invalid_chars = '<>:"/\\|?*' # 将每个无效字符替换为下划线,保留文件名核心信息 for char in invalid_chars: filename = filename.replace(char, '_') return filename base_dir = os.getcwd() print(base_dir) url = 'https://drive.google.com/u/0/uc?id=1KD3dIMaJU6SY8NX38jOW3DWQYjPGN-9A&export=download' resource = request.urlopen(request.Request(url)) content = resource.getheader('Content-Disposition') filename = content.split('*=')[1] filename = unquote(filename.split("''")[1]) # 清理文件名中的无效字符 filename = sanitize_filename(filename) filepath = os.path.join(base_dir, filename) with urlopen(url) as file: file_content = file.read() # 使用二进制模式写入文件,适配MP4等非文本格式 with open(filepath, "wb") as f: f.write(file_content)
关键修改说明
- 文件名清理:通过
sanitize_filename函数替换Windows禁止的字符,既规避系统报错,又最大程度保留原文件名的可读性。 - 二进制写入:将打开模式从
"w"改为"wb",确保二进制文件的字节流被正确写入,避免文件损坏。
内容的提问来源于stack exchange,提问作者Mubin Icyer
相关产品推荐
相关产品推荐

