You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何忽略JSONL文件中的无效文档?Python 3.4技术求助

解决JSONL文件错误行跳过问题

我来帮你搞定这个问题!你遇到的核心问题是生成器里的json.loads没有错误处理,而且之前的try-except放错了位置——因为生成器是惰性执行的,只有当你迭代它的时候才会去解析每一行,这时候报错就直接中断整个流程了。

修改后的load_tweets函数

把错误处理逻辑直接嵌入生成器的每一行解析环节,就能轻松跳过格式错误的行:

import json

def load_tweets(file):
    with open(file, 'r', encoding="UTF-8") as f:
        # 从1开始计数行号,方便定位错误位置
        for line_num, line in enumerate(f, start=1):  
            line = line.strip()
            # 先跳过空行,避免空字符串导致的解析错误
            if not line:
                continue
            try:
                tweet = json.loads(line)
                yield tweet
            except json.JSONDecodeError as e:
                # 打印错误信息方便后续排查,也可以注释掉这行只静默跳过
                print(f"第{line_num}行解析失败: {e}\n错误内容预览: {line[:200]}...")
                continue

为什么这个方法有效?

  • try-except直接包裹在json.loads外面,每解析一行就检查一次错误,遇到问题直接跳过该行,不会中断整个迭代过程。
  • 加入行号和错误内容预览,方便你后续如果需要排查错误行的话,能快速定位问题。
  • 直接遍历文件对象f而非用f.readlines(),更节省内存(大文件友好),因为后者会把整个文件读到内存里。

你的遍历代码怎么改?

现在可以正常遍历生成器,不用再担心中途崩溃:

for myfile in myfiles:
    tweets = load_tweets(myfile)
    for t in tweets:
        # 处理正常的tweet对象,比如提取字段
        try:
            data['id'].append(t['id'])
            # 其他字段的提取逻辑...
        except KeyError as e:
            # 可选:处理字段缺失的情况
            print(f"Tweet缺少字段{e}: {t.get('id', '无ID标识')}")
            continue

内容的提问来源于stack exchange,提问作者Martin Tavarez

火山引擎 最新活动