我想将具有相同格式的json数据的txt文件中的字符串数据转换为json数据,但是我遇到了这个问题。我试图以多种方式解决问题,但我没有成功。这是我的代码:
import json
tweets_data = []
tweets_file = open('teste.txt', "r")
for line in tweets_file:
dic_string = json.dumps(line)
json_acceptable_string = dic_string.replace("'", '"')
tweet = json.loads(json_acceptable_string)
tweets_data.append(tweet)
错误:
ValueError Traceback (most recent call last)
/home/cloves/Documentos/web_scraping/brincando_com_api_twitter/code_twitter/organize_data.py in <module>()
11 dic_string = json.dumps(line)
12 json_acceptable_string = dic_string.replace("'", '"')
---> 13 tweet = json.loads(json_acceptable_string)
14 tweets_data.append(tweet)
15
/home/cloves/anaconda2/lib/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
337 parse_int is None and parse_float is None and
338 parse_constant is None and object_pairs_hook is None and not kw):
--> 339 return _default_decoder.decode(s)
340 if cls is None:
341 cls = JSONDecoder
/home/cloves/anaconda2/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
365 end = _w(s, end).end()
366 if end != len(s):
--> 367 raise ValueError(errmsg("Extra data", s, end, len(s)))
368 return obj
369
ValueError: Extra data: line 1 column 5 - line 1 column 2319 (char 4 - 2318)
数据在postbin http://pastebin.com/UifenBxQ
上示例文件(只有一行):
{u'contributors': None, u'truncated': False, u'text': u'#salina lawyers verifone ruby back office software', u'is_quote_status': False, u'in_reply_to_status_id': None, u'id': 814580560538562560, u'favorite_count': 0, u'source': u'<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>', u'retweeted': False, u'coordinates': None, u'timestamp_ms': u'1483046114464', u'entities': {u'user_mentions': [], u'symbols': [], u'hashtags': [{u'indices': [0, 7], u'text': u'salina'}], u'urls': []}, u'in_reply_to_screen_name': None, u'id_str': u'814580560538562560', u'retweet_count': 0, u'in_reply_to_user_id': None, u'favorited': False, u'user': {u'follow_request_sent': None, u'profile_use_background_image': True, u'default_profile_image': False, u'id': 332149323, u'verified': False, u'profile_image_url_https': u'https://pbs.twimg.com/profile_images/813776354625880064/Gx6wAXpp_normal.jpg', u'profile_sidebar_fill_color': u'DDEEF6', u'profile_text_color': u'333333', u'followers_count': 13, u'profile_sidebar_border_color': u'C0DEED', u'id_str': u'332149323', u'profile_background_color': u'C0DEED', u'listed_count': 35}
答案 0 :(得分:0)
首先,这个:
dic_string = json.dumps(line)
没用,你已经有了一个字符串,不需要再次序列化。
然后,输入有简单的引号和unicode前缀,它不是json
格式,而是python dict格式。也许问题应该在另一端修复。
无论如何,我们试着从这里解决它。您尝试用双引号替换引号是危险的,因为您也可以替换字符串中的引号。
让我们检查格式:
{u'contributors': None, u'truncated': False, u'text': u'#salina lawyers verifone ruby back office software', ...
基本上每一行都是一个有效的python字典,因此我将使用ast.literal_eval
而不是json
来解析每一行,让我们在列表解析中进行解析以提高效率。
import ast
with open('teste.txt', "r") as tweets_file:
tweets_data = [ast.literal_eval(line) for line in tweets_file]
现在tweets_data
是包含您数据的词典列表。
请注意,ast.literal_eval
也可以反序列化json数据。