首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用以下方法从json中删除项?

如何使用以下方法从json中删除项?
EN

Stack Overflow用户
提问于 2019-02-27 09:59:32
回答 4查看 71关注 0票数 1

我需要在使用以下代码时从json中删除数据:

代码语言:javascript
复制
import json
with open('E:/file/timings.json', 'r+') as f:
    qe = json.load(f)
    for item in qe['times']:
        if item['Proc'] == 'APS':
            print(f'{item["Num"]}')
            del item
        json.dump(qe, f, indent=4, sort_keys=False, ensure_ascii=False)

这不会从JSON中删除任何内容,下面是我的JSON文件的一个小示例

代码语言:javascript
复制
{
    "times": [
        {
            "Num": "12345678901234567",
            "Start_Time": "2016-12-14 15:54:35",
            "Proc": "UPD",
        },
        {
            "Num": "12345678901234567",
            "Start_Time": "2016-12-08 15:34:05",
            "Proc": "APS",
        },
        {
            "Num": "12345678901234567",
            "Start_Time": "2016-11-30 11:20:21",
            "Proc": "Dev,

我希望它看起来像这样:

代码语言:javascript
复制
{
    "times": [
        {
            "Num": "12345678901234567",
            "Start_Time": "2016-12-14 15:54:35",
            "Proc": "UPD",
        },
        {
            "Num": "12345678901234567",
            "Start_Time": "2016-11-30 11:20:21",
            "Proc": "Dev,

如您所见,当进程被移除时,包含APS的部分。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-27 10:21:35

您可以保存初始的json,然后创建不包含'Proc‘等于’new_json‘的项的新json,然后用该new_json覆盖json文件。

代码语言:javascript
复制
import json

content = json.loads(open('timings.json', 'r').read())

new_json = {'times': []}

for item in content['times']:
    if item['Proc'] != 'APS':
        new_json['times'].append(item)

file = open('timings.json', 'w')
file.write(json.dumps(new_json, indent=4, sort_keys=False, ensure_ascii=False))
file.close()
票数 1
EN

Stack Overflow用户

发布于 2019-02-27 10:17:38

在迭代列表时删除元素不是一个好做法。

使用:

代码语言:javascript
复制
import json
with open('E:/file/timings.json', 'r') as f:
    qe = json.load(f)

qe = [item for item in qe['times'] if item['Proc'] != 'APS']    #Delete Required element. 

with open('E:/file/timings.json', 'w') as f:
    json.dump(qe, f, indent=4, sort_keys=False, ensure_ascii=False)
票数 1
EN

Stack Overflow用户

发布于 2019-02-27 10:20:16

在使用del时,从会话中移除变量item,但在数据结构中保留实际项。您需要显式地从数据结构中移除item所指向的任何内容。此外,在对所述列表进行迭代时,要避免从列表中删除项。您应该重新创建整个列表:

代码语言:javascript
复制
qe['times'] = [item for item in qe['times'] if item['Proc'] != 'APS']

如果需要打印,可以使用方法:

代码语言:javascript
复制
def keep_item(thing):
    if item['Proc'] == 'APS':
        print thing['Num']
        return False
    else:
         return True


qe['times'] = [item for item in qe['times'] if keep_item(item)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54902692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档