Delete an element in a JSON object
Question: I am trying to loop through a list of objects deleting an element from each
object. Each object is a new line. I am trying to then save the new file as is
without the element contained within the objects. I know this is probably a
simple task but I cannot not seem to get this work. Would be grateful if
somebody could offer a hand. Thanks.

    
    
    {
    "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"
    

}

I need to remove the information contained within the hours element however
the information is not always the same. Some contain all the days and some
only contain one or two day information. The code i've tried to use is Pyton
that I have search throughout the day to use with my problem. I am not very
skilled with Python. Any help would be appreciated.

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

Sorry Just to Add the error I am getting when running the code is TypeError:
'unicode' object does not support item deletion


Answer: Let's assume you want to overwrite the same file:

    
    
    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)` is probably what you where looking for, if I
understood your requirements. Because it will remove the `hours` key if
present and will not fail if not present.

However I am not sure I understand why it makes a difference to you whether
the hours key contains some days or not, because you just want to get rid of
the whole key / value pair, right?

Now, if you really want to use `del` instead of `pop`, here is how you could
make your code work:

    
    
    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** So, as you can see, I added the code to write the data back to the
file. If you want to write it to another file, just change the filename in the
second open statement.

I had to change the indentation, as you might have noticed, so that the file
has been closed during the data cleanup phase and can be overwritten at the
end.

`with` is what is called a context manager, whatever it provides (here the
data_file file descriptor) is available **ONLY** within that context. It means
that as soon as the indentation of the `with` block ends, the file gets closed
and the context ends, along with the file descriptor which becomes invalid /
obsolete.

Without doing this, you wouldn't be able to open the file in write mode and
get a new file descriptor to write into.

I hope it's clear enough...

**SECOND EDIT**

This time, it seems clear that you need to do this:

    
    
    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))
    

