我正在尝试使用以下代码加载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,
仅供参考,数据与推文相关,“转推”通常是新推文中的第一个元素,而“收藏”则是最后一个推文。
如果您能提供帮助,请提前感谢您。
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}]
你云试试:python的re.sub
它使用以下格式:
result = re.sub(pattern, replacement, input)
所以在你的情况下它会是这样的:
clean_data = re.sub('][', '', data)
一会儿就有同样的问题了。由于某种原因,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
],
我没有看到第一个方括号被关闭的地方,或者至少它应该被关闭的地方。