ValueError:额外数据:第1行第5列 - 第1行第2319行(字符4 - 2318)

时间:2016-12-30 16:51:12

标签: python json

我想将具有相同格式的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}

1 个答案:

答案 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数据。