Estoy obteniendo algunos datos de un archivo JSON "new.json", y quiero filtrar algunos datos y almacenarlos en un nuevo archivo JSON. Aquí está mi 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
y recibo un error, el rastreo es:
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)
¿Alguien me puede ayudar?
Aquí hay una muestra de los datos en new.json, hay alrededor de 1500 diccionarios más en el archivo
{
"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
Respuestas:
Como puede ver en el siguiente ejemplo,
json.loads
(yjson.load
) no decodifica múltiples objetos json.Si desea volcar varios diccionarios, envuélvalos en una lista, voltee la lista (en lugar de volcar los diccionarios varias veces)
fuente
new.json
contiene un json y otros datos redundantes.json.load
,json.loads
solo puede decodificar un json. Levanta unValueError
cuando encuentra datos adicionales como puede ver.new.json
, simplemente coloque un solo json en un archivo.Puede leer desde un archivo,
jsonifying
cada línea a medida que avanza:Esto evita almacenar objetos intermedios de python. Siempre que escriba un tweet completo por
append()
llamada, esto debería funcionar.fuente
Encontré esto porque estaba tratando de cargar un archivo JSON volcado de MongoDB. Me estaba dando un error
El volcado MongoDB JSON tiene un objeto por línea, así que lo que funcionó para mí es:
fuente
Esto también puede suceder si su archivo JSON no es solo 1 registro JSON. Un registro JSON se ve así:
Se abre y se cierra con un corchete [], dentro de los corchetes están los corchetes {}. Puede haber muchos pares de llaves, pero todo termina con una llave cerrada]. Si su archivo json contiene más de uno de esos:
entonces carga () fallará.
Verifiqué esto con mi propio archivo que estaba fallando.
Esto funciona porque 1_guests.json tiene un registro []. El archivo original que estaba usando all_guests.json tenía 6 registros separados por nueva línea. Eliminé 5 registros (que ya verifiqué para que se corrigieran entre paréntesis) y guardé el archivo con un nuevo nombre. Entonces la declaración de cargas funcionó.
El error fue
PD. Uso la palabra registro, pero ese no es el nombre oficial. Además, si su archivo tiene caracteres de nueva línea como el mío, puede recorrerlo para cargar () un registro a la vez en una variable json.
fuente
json.loads
leer fragmentos json delimitados por nueva línea? Es decir, ¿actuar como[json.loads(x) for x in text.split('\n')]
? Relacionado: ¿Existe una garantía quejson.dumps
no incluirá nuevas líneas literales en su salida con sangría predeterminada?json.dumps
cambiará las nuevas líneas en el contenido del texto a"\n"
, manteniendo su json en una sola línea.Bueno, podría ayudar a alguien. acabo de recibir el mismo error mientras mi archivo json es así
y lo encontré malformado, así que lo cambié a una especie de
fuente
Una línea para su problema:
fuente
Si quieres resolverlo en dos líneas puedes hacerlo así:
fuente
Creo que guardar los dictados en una lista no es una solución ideal aquí propuesta por @falsetru.
Mejor manera es, iterando a través de los dictados y guardándolos en .json agregando una nueva línea.
nuestros 2 diccionarios son
puedes escribirlos a .json
y puedes leer el archivo json sin ningún problema
simple y eficiente
fuente