Estou recebendo alguns dados de um arquivo JSON "new.json" e quero filtrar alguns dados e armazená-los em um novo arquivo JSON. Aqui está o meu código:
import json
with open('new.json') as infile:
data = json.load(infile)
for item in data:
iden = item.get["id"]
a = item.get["a"]
b = item.get["b"]
c = item.get["c"]
if c == 'XYZ' or "XYZ" in data["text"]:
filename = 'abc.json'
try:
outfile = open(filename,'ab')
except:
outfile = open(filename,'wb')
obj_json={}
obj_json["ID"] = iden
obj_json["VAL_A"] = a
obj_json["VAL_B"] = b
e estou recebendo um erro, o rastreamento é:
File "rtfav.py", line 3, in <module>
data = json.load(infile)
File "/usr/lib64/python2.7/json/__init__.py", line 278, in load
**kw)
File "/usr/lib64/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.7/json/decoder.py", line 369, in decode
raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 88 column 2 - line 50607 column 2 (char 3077 - 1868399)
Alguém pode me ajudar?
Aqui está uma amostra dos dados em new.json, existem cerca de 1500 outros dicionários no arquivo
{
"contributors": null,
"truncated": false,
"text": "@HomeShop18 #DreamJob to professional rafter",
"in_reply_to_status_id": null,
"id": 421584490452893696,
"favorite_count": 0,
"source": "<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Mobile Web (M2)</a>",
"retweeted": false,
"coordinates": null,
"entities": {
"symbols": [],
"user_mentions": [
{
"id": 183093247,
"indices": [
0,
11
],
"id_str": "183093247",
"screen_name": "HomeShop18",
"name": "HomeShop18"
}
],
"hashtags": [
{
"indices": [
12,
21
],
"text": "DreamJob"
}
],
"urls": []
},
"in_reply_to_screen_name": "HomeShop18",
"id_str": "421584490452893696",
"retweet_count": 0,
"in_reply_to_user_id": 183093247,
"favorited": false,
"user": {
"follow_request_sent": null,
"profile_use_background_image": true,
"default_profile_image": false,
"id": 2254546045,
"verified": false,
"profile_image_url_https": "https://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg",
"profile_sidebar_fill_color": "171106",
"profile_text_color": "8A7302",
"followers_count": 87,
"profile_sidebar_border_color": "BCB302",
"id_str": "2254546045",
"profile_background_color": "0F0A02",
"listed_count": 1,
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"utc_offset": null,
"statuses_count": 9793,
"description": "Rafter. Rafting is what I do. Me aur mera Tablet. Technocrat of Future",
"friends_count": 231,
"location": "",
"profile_link_color": "473623",
"profile_image_url": "http://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg",
"following": null,
"geo_enabled": false,
"profile_banner_url": "https://pbs.twimg.com/profile_banners/2254546045/1388065343",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"name": "Jayy",
"lang": "en",
"profile_background_tile": false,
"favourites_count": 41,
"screen_name": "JzayyPsingh",
"notifications": null,
"url": null,
"created_at": "Fri Dec 20 05:46:00 +0000 2013",
"contributors_enabled": false,
"time_zone": null,
"protected": false,
"default_profile": false,
"is_translator": false
},
"geo": null,
"in_reply_to_user_id_str": "183093247",
"lang": "en",
"created_at": "Fri Jan 10 10:09:09 +0000 2014",
"filter_level": "medium",
"in_reply_to_status_id_str": null,
"place": null
}
more than one object per line
Respostas:
Como você pode ver no exemplo a seguir,
json.loads
(ejson.load
) não decodifica vários objetos json.Se você deseja despejar vários dicionários, envolva-os em uma lista, despeje a lista (em vez de despejar dicionários várias vezes)
fonte
new.json
contém um json e outros dados redundantes.json.load
,json.loads
só pode decodificar um json. Ele gera umValueError
quando encontra dados adicionais como você vê.new.json
, basta colocar um único json em um arquivo.Você pode apenas ler de um arquivo,
jsonifying
cada linha à medida que avança:Isso evita o armazenamento de objetos python intermediários. Contanto que você escreva um tweet completo por
append()
chamada, isso deve funcionar.fonte
Me deparei com isso porque estava tentando carregar um arquivo JSON despejado do MongoDB. Isso estava me dando um erro
O dump JSON do MongoDB possui um objeto por linha, então o que funcionou para mim é:
fonte
Isso também pode acontecer se o seu arquivo JSON não for apenas um registro JSON. Um registro JSON se parece com isso:
Abre e fecha com um colchete [], dentro dos colchetes estão os colchetes {}. Pode haver muitos pares de chaves, mas tudo termina com uma chave estreita]. Se o seu arquivo json contiver mais de um deles:
então o load () falhará.
Eu verifiquei isso com meu próprio arquivo que estava falhando.
Isso funciona porque 1_guests.json possui um registro []. O arquivo original que eu estava usando all_guests.json tinha 6 registros separados por nova linha. Eu apaguei 5 registros (que eu já verifiquei serem reservados entre colchetes) e salvei o arquivo com um novo nome. Então a declaração de cargas funcionou.
O erro foi
PS. Eu uso o registro de palavras, mas esse não é o nome oficial. Além disso, se o seu arquivo tiver caracteres de nova linha como o meu, você poderá fazer um loop para carregar () um registro de cada vez em uma variável json.
fonte
json.loads
ler trechos de json delimitados por novas linhas? Ou seja, para agir como[json.loads(x) for x in text.split('\n')]
? Relacionado: Existe uma garantia quejson.dumps
não inclua novas linhas literais em sua saída com recuo padrão?json.dumps
, alterará novas linhas no conteúdo de texto para"\n"
, mantendo seu json em uma única linha.Bem, isso pode ajudar alguém. Eu só tenho o mesmo erro enquanto meu arquivo json é assim
e eu achei mal formado, então eu mudei para uma espécie de
fonte
Uma linha para o seu problema:
fonte
Se você quiser resolvê-lo em duas linhas, faça o seguinte:
fonte
Acho que salvar ditados em uma lista não é uma solução ideal aqui proposta por @falsetru.
A melhor maneira é iterar pelos dicts e salvá-los em .json adicionando uma nova linha.
nossos 2 dicionários são
você pode gravá-los em .json
e você pode ler o arquivo json sem problemas
simples e eficiente
fonte