我有一个JSON文件(test.JSON(,它有一个列表:
[
{
"Action": "ADD",
"Properties": {
"Type": "New",
"Value": "List"
}
},
{
"Action": "REMOVE",
"Properties": {
"Type": "New",
"Value": "Image"
}
},
{
"Action": "ADD",
"Properties": {
"Type": "New",
"Value": "Text"
}
}
]
我需要遍历列表并删除包含"REMOVE"的键(项(,即项[操作]="REMOVE"。
删除后应该是这样的:
[
{
"Action": "ADD",
"Properties": {
"Type": "New",
"Value": "List"
}
},
{
"Action": "ADD",
"Properties": {
"Type": "New",
"Value": "Text"
}
}
]
我用这个打印项目。如何删除项目?
with open('test.json') as json_data:
data = json.load(json_data)
for item in data:
if item['Action'] == "REMOVE":
print item
如果需要在适当的位置删除项,则需要其索引。
但这正是enumerate
的作用:
with open('test.json') as json_data:
data = json.load(json_data)
for index, item in enumerate(data):
if item['Action'] == "REMOVE":
del data[index]
break
请注意,只有当您确定只删除一个值时,这才会起作用。因为当您从列表中del
一个值时,它之后的所有内容都会向上移动一个槽,如果您仍在尝试对列表进行迭代,往好了说,您最终会跳过循环中的一个值,往坏了说,会造成巨大的混乱。如果出现这种情况,有各种方法可以解决,但如果你不需要,不要增加复杂性。
如果由于某种原因不需要进行适当的更改,除非data
很大,否则通常最好制作一个新列表,其中包含您想要保留的所有值:
with open('test.json') as json_data:
data = json.load(json_data)
new_data = []
for item in data:
if item['Action'] != "REMOVE":
new_data.append(item)
…你可以把它浓缩成一个简单的理解:
with open('test.json') as json_data:
data = json.load(json_data)
new_data = [item for item in data if item['Action'] != "REMOVE"]
无论哪种方式,请注意,与del
不同,如果有多个值与"REMOVE"
匹配,则此方法会自动工作,不需要任何技巧。
无论何时需要过滤列表,都应该使用列表理解:
with open('test.json') as json_data:
data = json.load(json_data)
filtered_data = [item for item in data if item['Action'] != 'REMOVE']
我最终使用了这个:
with open('test.json') as json_data:
data = json.load(json_data)
for index, item in enumerate(data):
if item['Action'] == "REMOVE":
del( data[index] )
with open('test.json', "w") as outfile:
outfile.write(json.dumps(data, indent=4))
data = [x for x in json_data if not x['ACTION'] == 'REMOVE']
另一种获取仅包含所需项目的新列表的方法。