如何在Python中加载json文件时替换不需要的字符[]?

问题描述 投票:-1回答:3

我正在尝试使用以下代码加载json文件:

with open('tweets_036.jsonl') as json_file:
    data = json.load(json_file)

但我得到以下错误消息:

JSONDecodeError: Extra data: line 24289 column 2 (char 1088180)

当我看一下文件/ 24289行时,我可以看到[]导致了问题:

        "favorited": false
    }
][
    {
        "retweeted": false,

与之前的行相比,它应该是:

        "favorited": false
    },
    {
        "retweeted": false,

仅供参考,数据与推文相关,“转推”通常是新推文中的第一个元素,而“收藏”则是最后一个推文。

如果您能提供帮助,请提前感谢您。

python json
3个回答
2
投票

使用str.replace()

tweets_036.jsonl:

[
    {
      "favorited": false
    }
][
    {
      "retweeted": false
    }
]

因此:

import json

with open('tweets_036.jsonl', 'r') as file:
    content = file.read()
    clean = content.replace('][', ',')  # cleanup here
    json_data = json.loads(clean)

print(json_data)

OUTPUT:

[{'favorited': False}, {'retweeted': False}]

1
投票

你云试试:python的re.sub

它使用以下格式:

result = re.sub(pattern, replacement, input)

所以在你的情况下它会是这样的:

clean_data = re.sub('][', '', data)

0
投票

一会儿就有同样的问题了。由于某种原因,twitter返回列表中的多个json结构,但不会使用逗号分隔列表,因此将每个json元素放在[ ]之间,并将它们附加到实际列表中。所以你最终得到一个json结构化数据列表。这是我前一段时间使用的解决方案:

import json

filename='C:/tweets_043.json'


with open(filename) as json_file:  
    data_str = json_file.read()
    data_str = data_str.split('[',1)[-1]
    data_str = data_str.rsplit(']',1)[0]
    data_str = data_str.split('][')

clean_data = []
need_cleaning = False
for i, each in enumerate(data_str):
    if need_cleaning == True:
        hold_string = hold_string + '][' + each
        if each.strip()[-1] != '}':
            continue
        else:
            clean_data.append(hold_string.strip())
            need_cleaning = False
            continue

    if each.strip()[-1] != '}':
        hold_string = data_str[i]
        need_cleaning = True
        continue

    else:
        clean_data.append(each.strip())
        need_cleaning = False





data = []
error = []
for jsonStr in clean_data:

    jsonStr = '[' + jsonStr + ']'
    try:
        temp_data = json.loads(jsonStr.strip())
        for each in temp_data:
            data.append(each)
    except:
        print ('error')
        error.append(jsonStr)

解析除一个之外的所有内容(您在评论中也说明了这一点)。问题出在哪里:

                        "large": {
                            [{
                                    "is_quote_status": false,
                                    "filter_level": "low",
                                    "in_reply_to_screen_name": "Huawei",
                                    "display_text_range": [
                                        8,
                                        53
                                    ],

我没有看到第一个方括号被关闭的地方,或者至少它应该被关闭的地方。

© www.soinside.com 2019 - 2024. All rights reserved.