Python open读取文件无法识别换行符及ASCII字符问题求解
问题核心原因
readlines()一次性读取全部内容、无法识别换行:你的源文件中不存在真正的换行控制符(ASCII 0x0a),你看到的\n是文件里存储的字面量字符——也就是反斜杠(ASCII 0x5c)和字母n(ASCII 0x6e)两个独立字符,Python找不到行分隔标记自然会把整个文件识别为单行。你之前尝试修改open()的编码参数没用,本质是因为这不是编码识别错误,是文件本身存储的内容就没有实际换行符。- 非ASCII字符显示为原始形式:你的
strip_accents函数存在Python版本兼容问题,Python3中读取文本模式文件返回的默认就是Unicode字符串,函数内的unicode类型判断分支直接跳过了编码转换步骤,加上源文件中部分特殊字符本身是以转义字面量形式存储的,没有被正确解析。 - 原代码存在内存溢出风险:4GB大小的文件如果全部读取后拼接为单个字符串,内存占用会是文件大小的2-3倍,普通消费级内存根本扛不住,直接会触发OOM崩溃。
- 原替换逻辑存在漏判风险:逐块/逐行读取时,如果
}{这个匹配串刚好被拆分在两次读取的内容边界上,会出现替换遗漏。
可直接运行的修复代码
代码采用流式读写处理,内存占用稳定在10MB以内,不会出现内存溢出,同时处理了跨块匹配漏替换、字符转义、字面量换行的问题:
import unicodedata def strip_accents(text: str) -> str: # 直接适配Python3,移除旧版本unicode兼容分支 normalized = unicodedata.normalize('NFD', text) # 过滤非ASCII重音字符,保留可打印ASCII内容 return normalized.encode('ascii', 'ignore').decode('ascii') if __name__ == '__main__': input_file = 'json/get_tweets.json' output_file = 'json/get_tweets_fixed.json' read_chunk_size = 8 * 1024 * 1024 # 每次读8MB块,平衡IO和处理效率 match_str = '}{' replace_str = '},{' with open(input_file, 'r', encoding='utf-8', errors='replace') as f_in, \ open(output_file, 'w', encoding='utf-8') as f_out: # 先写数组开头 f_out.write('[') # 缓冲区存上一个块的末尾内容,解决跨块匹配的问题 prev_tail = '' while True: chunk = f_in.read(read_chunk_size) if not chunk: # 处理最后剩余的缓冲区内容 if prev_tail: processed = strip_accents(prev_tail.replace(match_str, replace_str)) # 把字面量\n替换为实际换行,不需要可以直接注释掉 processed = processed.replace('\\n', '\n') f_out.write(processed) break # 拼接上一块的尾巴和当前块,避免跨块的}{漏替换 full_chunk = prev_tail + chunk # 留最后1个字符当下一轮的prev_tail,因为匹配串长度是2 prev_tail = full_chunk[-1:] process_part = full_chunk[:-1] # 执行替换和字符清理 process_part = process_part.replace(match_str, replace_str) process_part = strip_accents(process_part) # 替换字面量换行符为实际换行,不需要可注释 process_part = process_part.replace('\\n', '\n') f_out.write(process_part) # 写数组闭合 f_out.write(']')
注意事项
- 如果你的业务场景需要保留JSON字符串内部的
}{内容(比如推文正文里刚好出现这两个连续字符),不要直接用全局替换,建议替换完成后用流式JSON解析工具(比如ijson)校验文件格式合法性,避免内容被改坏。 - 如果你不需要把字面量
\n转成实际换行,直接把代码里对应的替换行注释掉即可。 - 处理完成后确认输出文件正常,再替换原文件即可,避免原始文件损坏。
内容的提问来源于stack exchange,提问作者Zerphyrum
相关产品推荐
相关产品推荐

