Python3。向现有密钥

时间:2018-03-07 17:53:38

标签: python dictionary

我知道有很多关于这个主题的信息,但我真的很困惑这个问题。

我从文件中加载了一个字典:

datastore = json.load(f)    
print(datastore)
{"a": "999", "b": "345"}

现在,我需要为现有密钥添加更多值。

但我收到错误:

  

AttributeError: 'str' object has no attribute 'append'

这是我到目前为止所尝试的内容:

if key in datastore:
    temp = []
    [temp.extend([k, v]) for k, v in datastore.items()]
    print(temp)
    print(type(temp))
    i = temp.index(key)
    print(i)
    temp[i].append(value)
    print(temp)

if key in datastore:
    datastore.setdefault(key, [])
    datastore[key].append(value)

结果是一样的:

  

'str' object has no attribute 'append'

请帮忙!

以下完整代码:

import os
import json
import argparse
import sys

if len(sys.argv) > 3:

  parser = argparse.ArgumentParser()
  parser.add_argument("--key")
  parser.add_argument("--val")
  args = parser.parse_args()

  key = args.key
  value = args.val

  storage = {}
  storage[key] = value

  if os.path.exists('storage_file'):
    with open('storage_file', 'r') as f:
      datastore = json.load(f)
      if key in datastore:
        datastore.setdefault(key, [])
        datastore[key].append(value)
      else:
        datastore.update({key: value})
      with open('storage_file', 'w') as f:
        json.dump(datastore, f)
  else:
    with open('storage_file', 'w') as f:
      json.dump(storage, f)

else:
  parser = argparse.ArgumentParser()
  parser.add_argument("--key", action="store")
  args = parser.parse_args()

  key = args.key

  with open('storage_file', 'r') as f:
    datastore = json.load(f)
    print(datastore.get(key))

1 个答案:

答案 0 :(得分:0)

这不行,原因见评论:

if os.path.exists('storage_file'):
   with open('storage_file', 'r') as f:
     datastore = json.load(f)
     if key in datastore:
       datastore.setdefault(key, [])   # key already exists, you just checked it, so it  
       datastore[key].append(value)    # will not create [], tries append to existing data
     else:
       datastore.update({key: value})
     with open('storage_file', 'w') as f:
       json.dump(datastore, f) 

您可以尝试使用以下方法修复它:

if os.path.exists('storage_file'):
   with open('storage_file', 'r') as f:
     datastore = json.load(f)
     if key in datastore:
       val = datastore[key]
       if type(val) == str:               # check if it is a string / if you use other
         datastore[key] = [ val ]         # types you need to check if not them as well
       datastore[key].append(value) 
     else:
       datastore.setdefault(key, [ value ])    # create default [] of value

     with open('storage_file', 'w') as f:
        json.dump(datastore, f) 

(免责声明:代码未执行,可能包含拼写错误,告诉我,我会修复)

阅读:

检查从命令行解析的密钥是否已存储到加载为datastore的json文件中。如果您有一个包含某个键的字符串的文件,则loadign它将始终将其重新创建为字符串。

您的代码会检查密钥是否已在datastore中 - 如果是,代码会将值读入val。然后,它会检查val是否为str类型 - 如果是,则会将datastorekey的值替换为包含val的列表。然后它附加您从命令行解析的新参数。

如果在字典中,它会直接在datastore中创建条目作为列表,使用刚刚解析的值作为默认值列表。

然后将所有内容存回并替换当前文件。