删除JSON对象中的元素

Bra*_*ley 8 python jsonobject

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

{
"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"
Run Code Online (Sandbox Code Playgroud)

}

我需要删除hours元素中包含的信息,但信息并不总是相同.有些包含所有日期,有些仅包含一天或两天的信息.我尝试使用的代码是Pyton,我整天都在搜索我的问题.我对Python不是很熟练.任何帮助,将不胜感激.

import json

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

抱歉只是添加运行代码时遇到的错误是TypeError:'unicode'对象不支持删除项目

Ant*_*rot 24

假设您要覆盖同一个文件:

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)
Run Code Online (Sandbox Code Playgroud)

dict.pop(<key>, not_found=None)如果我理解你的要求,可能就是你在寻找的地方.因为hours如果存在,它将删除密钥,如果不存在则不会失败.

但是我不确定我理解为什么小时键是否包含某些天会对你产生影响,因为你只想摆脱整个键/值对,对吧?

现在,如果您真的想要使用del而不是pop,那么您可以使用以下代码:

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)
Run Code Online (Sandbox Code Playgroud)

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

正如您可能已经注意到的那样,我不得不更改缩进,以便在数据清理阶段关闭文件并在最后覆盖.

with什么叫做上下文管理器,无论它提供什么(这里的data_file文件描述符)在该上下文中可用.这意味着只要with块的缩进结束,文件就会关闭,上下文结束,文件描述符也会变为无效/过时.

如果不这样做,您将无法以写入模式打开文件并获取要写入的新文件描述符.

我希望它足够清楚......

第二次编辑

这一次,你似乎需要这样做:

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))
Run Code Online (Sandbox Code Playgroud)