我遇到了一些麻烦。 我正在尝试将此JSON写入DataFrame。我觉得我的问题是我如何格式化JSON。当我写每条推文时。但是无法缩小范围。任何见解都会很棒。附件是我的raw_tweets.json和下面的第二个代码打击是我如何写它,用逗号分隔,即加入(',')
HERE是 LINK TO raw_tweets.json
i get a raise JSONDecodeError("Extra data", s, end)
JSONDecodeError: Extra data
#JSON to DataFrame
class tweet2dframe(object):
def __init__(self, text="", location=""):
self.text = text
self.location = location
def getText(self):
return self.text
def getLocation(self):
return self.location
# import json package to load json file
with open('raw_tweets.json',encoding="utf8") as jsonFile:
polls_json = json.loads(jsonFile.read())
tweets_list = [polls(i["location"], i["text"]) for i in polls_json['text']]
colNames = ("Text", "location")
dict_list = []
for i in tweets_list:
dict_list.append(dict(zip(colNames , [i.getText(), i.getLocation()])))
tweets_df = pd.DataFrame(dict_list)
tweets_df.head()
我将推文写入JSON的方式
saveFile = io.open('raw_tweets.json', 'w', encoding='utf-8')
saveFile.write(','.join(self.tweet_data))
saveFile.close()
exit()
答案 0 :(得分:2)
raw_tweets.json
包含无效的JSON。它包含以逗号分隔的JSON片段。要使整个文本成为有效JSON array,请括号[...]
围绕内容:
with open('raw_tweets.json', encoding="utf8") as jsonFile:
polls_json = json.loads('[{}]'.format(jsonFile.read()))
例如,
import pandas as pd
import json
with open('raw_tweets.json', encoding="utf8") as jsonFile:
polls_json = json.loads('[{}]'.format(jsonFile.read()))
tweets_list = [(dct['user']['location'], dct["text"]) for dct in polls_json]
colNames = ("location", "text")
tweets_df = pd.DataFrame(tweets_list, columns=colNames)
print(tweets_df.head())
产量
location text
0 None RT @webseriestoday: Democracy Now: Noam Chomsk...
1 Pittsburgh PA "The tuxedo was an invention of the Koch broth...
2 None RT @webseriestoday: Democracy Now: Noam Chomsk...
3 None RT @webseriestoday: Democracy Now: Noam Chomsk...
解决问题的另一种更好的方法是在raw_tweets.json
中编写有效的JSON。毕竟,如果您想将文件发送给其他人,如果文件包含有效的JSON,您将使他们的生活更轻松。我们需要查看更多代码以确切地建议如何修复它,但通常您会希望使用json.dump
将一个dicts列表作为JSON写入文件而不是“手动”编写JSON代码段与saveFile.write(','.join(self.tweet_data))
:
tweets = []
for i in loop:
tweets.append(tweet_dict)
with io.open('raw_tweets.json', 'w', encoding='utf-8') as saveFile:
json.dump(tweets, saveFile)
如果raw_tweets.json
包含有效的JSON,那么您可以使用以下命令将其加载到Python的Python列表中:
with open('raw_tweets.json', encoding="utf8") as jsonFile:
polls_json = json.load(jsonFile)
将所需部分加载到DataFrame中的其余代码将保持不变。
如何构建这行代码:
tweets_list = [(dct['user']['location'], dct["text"]) for dct in polls_json]
在交互式Python会话中,我在polls_json
中检查了一个词典:
In [114]: import pandas as pd
In [115]: import json
In [116]: with open('raw_tweets.json', encoding="utf8") as jsonFile:
polls_json = json.loads('[{}]'.format(jsonFile.read()))
In [117]: dct = polls_json[1]
In [118]: dct
Out[118]:
{'contributors': None,
'coordinates': None,
...
'text': "Like the old Soviet leaders, Bernie refused to wear a tux at last night's black-tie dinner.",
'truncated': False,
'user': {'contributors_enabled': False,
...
'location': 'Washington DC',}}
它非常大,所以我在这里省略了部分内容以使结果更具可读性。
假设我正确猜到了您要查找的text
和location
值,
我们可以看到,根据此词典dct
,我们可以使用text
访问所需的dct['text']
值。但location'
键位于嵌套字典,dct['user']
内。因此,我们需要使用dct['user']['location']
来提取位置值。
顺便说一下,Pandas提供了一种方便的方法来将JSON读入DataFrame pd.read_json
,但它依赖于JSON数据是“平坦的”。因为我们想要的数据是嵌套的dicts,所以我使用自定义代码,列表理解
tweets_list = [(dct['user']['location'], dct["text"]) for dct in polls_json]
提取值而不是pd.read_json
。