使用JSON生成TXT文件时遇OSError: [Errno 22]无效参数求助
问题解决:文件名含\r导致OSError错误
问题分析
从报错信息'Saves/hello\r.txt'能看出,setname变量实际混入了回车符(\r)——这是Windows系统文件名禁止的控制字符,因此触发了OSError。即使你确认变量值为Hello,也可能是输入/赋值过程中带入了隐藏的控制字符(比如复制粘贴带换行的内容、用户输入误按回车、读取外部文本时未处理换行符等)。
解决方案
1. 验证变量真实内容
用repr()函数打印变量,能显示所有隐藏字符,快速确认是否存在\r或其他控制字符:
print(repr(setname)) # 若含\r,输出示例:'Hello\r'
2. 清理文件名中的非法字符
通过字符串处理或正则表达式,移除/替换Windows文件名不允许的字符(包括\r、\n、\、/等):
方法一:保留可打印字符,自动过滤控制字符
# 只保留可打印字符,自动移除\r、\n等控制字符 setname_clean = ''.join(c for c in setname if c.isprintable())
方法二:正则替换非法字符为下划线(更灵活)
import re # 匹配所有Windows非法文件名字符,替换为下划线 invalid_filename_chars = r'[\\/:*?"<>|\r\n]' setname_clean = re.sub(invalid_filename_chars, '_', setname.strip())
3. 改造原代码应用清理逻辑
将清理后的文件名用于文件操作:
import json import re # 定义文件名清理函数 def clean_filename(filename): invalid_chars = r'[\\/:*?"<>|\r\n]' return re.sub(invalid_chars, '_', filename.strip()) # 处理文件名 setname = "Hello" # 你的原始变量 setname_clean = clean_filename(setname) # 写入JSON文件 with open(f"Saves/{setname_clean}.txt", "w") as savefile: json.dump(data, savefile)
额外提示
如果setname来自用户输入或外部文本读取,建议在赋值环节就执行清理操作,从源头避免类似问题。
内容的提问来源于stack exchange,提问作者Plazm air
相关产品推荐
相关产品推荐

