Python写日志代码Linux正常Windows报OSError22如何实现跨系统兼容
兼容Windows/Linux的代码调整方案
报错原因
Windows系统对文件名的合法字符有严格限制,不允许包含:、/、\、*、?、"、<、>、|这些特殊字符,原有代码中生成文件名用的时间格式%Y-%m-%d %H:%M:%S带有冒号,在Linux下可以正常使用,但在Windows下会直接触发无效参数报错。
修改要点
- 替换时间格式化字符串里的冒号,改为横杠、下划线等合法的分隔符
- 补全缺失的
csv模块导入 - 新增logs文件夹不存在时的自动创建逻辑,避免无文件夹导致的写入报错
- 去掉不符合CSV标准的自定义分隔符配置,新增文件操作的兼容参数
完整修改后代码
import datetime import csv from os.path import dirname, abspath, join, exists from os import makedirs # 计算logs文件夹路径 parent_path = dirname(dirname(abspath(__file__))) logs_folder = join(parent_path, 'logs') # 自动创建不存在的logs文件夹 if not exists(logs_folder): makedirs(logs_folder, exist_ok=True) # 生成不带冒号的跨平台合法文件名 file_name = datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S")+'.csv' with open(join(logs_folder, file_name), 'w', newline='', encoding='utf-8') as fp: # 指定newline参数避免Windows下CSV自动插入空行,默认分隔符符合CSV标准规范 writer = csv.writer(fp) writer.writerow(list_input)
额外说明
- 打开文件时指定
newline=''是Python官方文档推荐的CSV写入标准写法,可以避免Windows系统下生成的CSV文件每行末尾多一个空行的问题 - 新增
encoding='utf-8'参数可以保证中英文内容在两个系统下写入读取的编码一致性
内容的提问来源于stack exchange,提问作者Bakytzhan
相关产品推荐
相关产品推荐

