web-dev-qa-db-fra.com

Supprimer un élément dans un objet JSON

J'essaie de parcourir une liste d'objets en supprimant un élément de chaque objet. Chaque objet est une nouvelle ligne. J'essaie ensuite de sauvegarder le nouveau fichier tel quel sans l'élément contenu dans les objets. Je sais que c'est probablement une tâche simple mais je n'arrive pas à ne pas obtenir ce travail. Serait reconnaissant si quelqu'un pouvait offrir un coup de main. Merci.

{
"business_id": "fNGIbpazjTRdXgwRY_NIXA",
"full_address": "1201 Washington Ave\nCarnegie, PA 15106",
"hours": {
    "Monday": {
        "close": "23:00",
        "open": "11:00"
    },
    "Tuesday": {
        "close": "23:00",
        "open": "11:00"
    },
    "Friday": {
        "close": "23:00",
        "open": "11:00"
    },
    "Wednesday": {
        "close": "23:00",
        "open": "11:00"
    },
    "Thursday": {
        "close": "23:00",
        "open": "11:00"
    },
    "Saturday": {
        "close": "23:00",
        "open": "11:00"
    }
},
"open": true,
"categories": ["Bars", "American (Traditional)", "Nightlife", "Lounges", "Restaurants"],
"city": "Carnegie",
"review_count": 7,
"name": "Rocky's Lounge",
"neighborhoods": [],
"longitude": -80.0849416,
"state": "PA",
"stars": 4.0,
"latitude": 40.3964688,
"attributes": {
    "Alcohol": "full_bar",
    "Noise Level": "average",
    "Music": {
        "dj": false
    },
    "Attire": "casual",
    "Ambience": {
        "romantic": false,
        "intimate": false,
        "touristy": false,
        "hipster": false,
        "divey": false,
        "classy": false,
        "trendy": false,
        "upscale": false,
        "casual": false
    },
    "Good for Kids": true,
    "Wheelchair Accessible": true,
    "Good For Dancing": false,
    "Delivery": false,
    "Dogs Allowed": false,
    "Coat Check": false,
    "Smoking": "no",
    "Accepts Credit Cards": true,
    "Take-out": true,
    "Price Range": 1,
    "Outdoor Seating": false,
    "Takes Reservations": false,
    "Waiter Service": true,
    "Wi-Fi": "free",
    "Caters": false,
    "Good For": {
        "dessert": false,
        "latenight": false,
        "lunch": false,
        "dinner": false,
        "brunch": false,
        "breakfast": false
    },
    "Parking": {
        "garage": false,
        "street": false,
        "validated": false,
        "lot": true,
        "valet": false
    },
    "Has TV": true,
    "Good For Groups": true
},
"type": "business"

}

Je dois supprimer les informations contenues dans l'élément heures, mais les informations ne sont pas toujours les mêmes. Certains contiennent tous les jours et certains ne contiennent que des informations sur un ou deux jours. Le code que j'ai essayé d'utiliser est Pyton que j'ai cherché tout au long de la journée pour utiliser mon problème. Je ne suis pas très habile avec Python. Toute aide serait appréciée.

import json

with open('data.json') as data_file:
data = json.load(data_file)
for element in data: 
        del element['hours']

Désolé juste pour ajouter l'erreur que j'obtiens lors de l'exécution du code est TypeError: l'objet 'unicode' ne prend pas en charge la suppression d'élément

8
Bradley

Supposons que vous souhaitiez remplacer le même fichier:

import json

with open('data.json', 'r') as data_file:
    data = json.load(data_file)

for element in data:
    element.pop('hours', None)

with open('data.json', 'w') as data_file:
    data = json.dump(data, data_file)

dict.pop(<key>, not_found=None) est probablement ce que vous cherchiez, si j'ai bien compris vos besoins. Parce qu'il supprimera la clé hours si elle est présente et n'échouera pas si elle n'est pas présente.

Cependant, je ne suis pas sûr de comprendre pourquoi cela fait une différence pour vous que la clé des heures contienne certains jours ou non, car vous voulez simplement vous débarrasser de la paire clé/valeur entière, non?

Maintenant, si vous voulez vraiment utiliser del au lieu de pop, voici comment vous pourriez faire fonctionner votre code:

import json

with open('data.json') as data_file:
    data = json.load(data_file)

for element in data:
    if 'hours' in element:
        del element['hours']

with open('data.json', 'w') as data_file:
    data = json.dump(data, data_file)

EDIT Donc, comme vous pouvez le voir, j'ai ajouté le code pour réécrire les données dans le fichier. Si vous souhaitez l'écrire dans un autre fichier, changez simplement le nom de fichier dans la deuxième instruction ouverte.

J'ai dû modifier l'indentation, comme vous l'avez peut-être remarqué, afin que le fichier soit fermé pendant la phase de nettoyage des données et puisse être écrasé à la fin.

with est ce qu'on appelle un gestionnaire de contexte, tout ce qu'il fournit (ici le descripteur de fichier data_file) est disponible SEULEMENT dans ce contexte. Cela signifie que dès que l'indentation du bloc with se termine, le fichier est fermé et le contexte se termine, ainsi que le descripteur de fichier qui devient invalide/obsolète.

Sans cela, vous ne pourriez pas ouvrir le fichier en mode écriture et obtenir un nouveau descripteur de fichier dans lequel écrire.

J'espère que c'est assez clair ...

DEUXIÈME MODIFICATION

Cette fois, il semble clair que vous devez faire ceci:

with open('dest_file.json', 'w') as dest_file:
    with open('source_file.json', 'r') as source_file:
        for line in source_file:
            element = json.loads(line.strip())
            if 'hours' in element:
                del element['hours']
            dest_file.write(json.dumps(element))
24
Anthony Perot