You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:27:24