我知道有很多关于这个主题的信息,但我真的很困惑这个问题。
我从文件中加载了一个字典:
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))
答案 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
类型 - 如果是,则会将datastore
中key
的值替换为包含val
的列表。然后它附加您从命令行解析的新参数。
如果键在字典中不,它会直接在datastore
中创建条目作为列表,使用刚刚解析的值作为默认值列表。
然后将所有内容存回并替换当前文件。