删除JSON对象中的元素 [英] Delete an element in a JSON object

查看:124
本文介绍了删除JSON对象中的元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图遍历对象列表,从每个对象中删除一个元素.每个对象都是换行符.我试图然后按原样保存新文件,而对象中不包含任何元素.我知道这可能是一个简单的任务,但似乎无法完成这项工作.如果有人可以提供帮助,将不胜感激.谢谢.

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"

}

我需要删除小时元素中包含的信息,但是该信息并不总是相同的.有些包含全天,有些仅包含一两天的信息.我尝试使用的代码是Pyton,我整天都在搜索该代码以解决问题.我对Python不太熟练.任何帮助,将不胜感激.

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']

抱歉,仅添加我在运行代码时遇到的错误是 TypeError:"unicode"对象不支持项目删除

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

推荐答案

假设您要覆盖同一文件:

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)可能就是您要查找的内容.因为它会删除hours键(如果存在),并且不会失败(如果不存在).

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?

现在,如果您真的想使用del而不是pop,可以通过以下方法使代码正常工作:

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)

编辑 因此,如您所见,我添加了代码以将数据写回到文件中. 如果要将其写入另一个文件,只需在第二个open语句中更改文件名.

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是所谓的上下文管理器,它提供的任何内容(此处为data_file文件描述符)都可以在该上下文中使用.这意味着with块的缩进一结束,文件就会关闭并且上下文结束,同时文件描述符也变得无效/过时.

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

第二编辑

这一次,看来您需要执行以下操作:

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

这篇关于删除JSON对象中的元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆