Python批量加载大量JSON文件报UnicodeDecodeError问题求助
核心报错原因
你猜测的「加载文件数量过多」不是问题根因,当前报错是文件编码不匹配导致的,和打开文件数无关。
你在Windows环境下调用open()读取文件时没有手动指定编码,Python会默认使用系统的cp1252编码解码文件内容,但你处理的JSON文件基本都是UTF-8编码(绝大多数公开JSON数据集默认编码),当文件里出现cp1252编码表不存在的字符时就会直接抛出解码错误终止程序——你刚好跑到第80个左右的文件时碰到了这类特殊字符,所以程序停在这。
自行排查优化方向(按优先级排序,可直接搜对应关键词找方案)
- 优先解决编码报错:检索关键词
Python open 函数 encoding参数、Python 读取文件 UnicodeDecodeError,核心修改点是给读取JSON文件的open()方法传入正确的编码参数;针对个别编码异常的坏文件,还可以配置errors参数选择跳过/替换异常字符,避免单个文件问题打断全量处理任务。 - 解决严重性能问题:你当前的写法每写一行CSV数据就会重新打开、关闭一次目标CSV文件,处理百万级文件时IO开销会非常大,整体耗时会高到难以接受。检索关键词
Python csv.writer 批量写入、Python with 语句作用域,把CSV文件的打开操作移到所有文件遍历循环的最外层,整个任务全程只打开一次CSV文件,所有数据写完后再统一关闭,处理速度能提升几十到上百倍。 - 增加坏文件容错逻辑:50万-100万量级的文件里必然混有损坏的JSON、字段缺失的异常文件,当前写法碰到这类文件会直接崩溃终止。检索关键词
Python try except 异常捕获,给单个文件的处理逻辑加异常捕获,碰到坏文件时记录对应文件名和错误原因后直接跳过,不要中断整体任务。 - 可选速度优化:如果调整完上述逻辑后还是觉得处理速度慢,可以检索关键词
Python 多进程 批量处理文件,用多进程并行解析JSON,处理速度还能提升数倍,注意多进程同时写CSV时要加写入锁,避免内容写乱。
现有代码非核心瑕疵(不触发当前报错,可后续调整)
InReplyToScreenName != "null"的判断逻辑有误:如果JSON里该字段是真正的空值,Python解析后会得到None类型,不是字符串"null",当前判断无法正确识别空值场景。- 取
RetweetedStatus、User这类嵌套字段时没有做判空,如果某条数据缺失对应嵌套字段,.get()拿到None后继续调用.get()会抛出属性错误。
内容的提问来源于stack exchange,提问作者Disstanz
相关产品推荐
相关产品推荐

