使用python在json中修改数组的第三个索引

时间:2015-02-02 08:08:05

标签: python arrays json

我有一个文件' test.json'其中包含一个数组" rows"和另一个子阵列"允许"其中一些字母表就像" A"," B"等。但我想修改子阵列的内容。我能怎么做??

test.json文件如下:

{"rows": [
    {
      "Company": "google",  
      "allowed": ["A","B","C"]},#array containg 3 variables
    {
      "Company": "Yahoo", 
      "allowed": ["D","E","F"]#array contanig 3 variables
    }
]}

但我想修改"允许"阵列。并希望将第3个索引更新为" LOOK"而不是" C"。以便结果数组看起来像:

{"rows": [
    {
      "Company": "google", 
      "allowed": ["A","B","LOOK"]#array containg 3 variables
    }, 
    {
    "Company": "Yahoo", #array containing 3 variables 
    "allowed": ["D","E","F"] #array containing 3 variables
    }
]}

我的节目:

import json 
with open('test.json') as f: 
   data = json.load(f) 
   for row in data['rows']: 
       a_dict = {row['allowed'][1]:"L"} 

with open('test.json') as f: 
    data = json.load(f) 
    data.update(a_dict) 

with open('test.json', 'w') as f: 
    json.dump(data, f,indent=2) 

1 个答案:

答案 0 :(得分:1)

您的程序存在一些问题。

第一个问题是你没有查找“允许”的最后一个元素。阵列:

a_dict = {row['allowed'][1]:"L"}

请记住,数组指标从零开始。例如:

['Index 0', 'Index 1', 'Index 2']

但主要的问题是,当你走过每一行时,你会获取内容 那一行,但后来不做任何事情。

import json 
with open('test.json') as f: 
   data = json.load(f) 
   for row in data['rows']: 
       a_dict = {row['allowed'][1]:"L"} 

       # a_dict is twiddling its thumbs here...
       # until it's replaced by the next row's contents
...

它只会被for循环的下一行替换,直到你离开了 最后一行全部在" a_dict"中,因为最后一行当然没有被覆盖 任何东西。在你的样本中,将是:

{'E': 'L'}

接下来,您再次加载原始的json数据(但是,您不需要 - 它' s 仍在您的数据变量中,未经修改),并向其添加a_dict:

with open('test.json') as f: 
    data = json.load(f) 
    data.update(a_dict) 

这让你知道:

{
  "rows": [
    {
      "Company": "google", 
      "allowed": ["A", "B", "C"]
    }, 
    {
      "Company": "Yahoo", 
      "allowed": ["D", "E", "F"]
    }
  ], 
  "E": "L"
}

所以,要解决这个问题,你需要:

  1. 指出正确的'允许' index(在你的情况下,那将是[2])和

  2. 修改行,而不是将它们复制出来并将它们合并回数据。

    在for循环中,数据[' rows']中的每一行都指向数据中的值,因此您可以更新行的内容,并完成您的工作。

    < / LI>

    我不清楚的一件事是你是否要更新所有行(通过循环遍历所有行),或者只更新第一行(如示例所需的输出所示)。

    所以这里有一个样本修复,无论哪种情况都适用:

    import json
    
    modify_first_row_only = True
    
    with open('test.json', 'r') as f:
        data = json.load(f)
        rows = data['rows']
    
        if modify_first_row_only:
            rows[0]['allowed'][2] = 'LOOK'
        else:
            for row in rows:
                row['allowed'][2] = 'LOOK'
    
    with open('test.json', 'w') as f:
        json.dump(data, f, indent=2)