我想在JSON中建立值的密钥库。一切都应通过输入到控制台的参数进行。也就是说,数据首先被写入文件,然后必须从那里读取。
输入:python storage.py --key key_name --value value_name
输出:python storage.py --key key_name
具有自变量的函数和具有数据输入的函数。但是我对文件读取功能有问题。我需要按键的值打印键,如果有多个键,则打印值。
记录的JSON看起来像这样:
{"key": "Pepe", "value": "Pepeyaya"}{"key": "PepeHug", "value": "KekeHug"}{"key": "Pepega", "value": "Kekega"}{"key": "Pepe", "value": "Keke"}
我试图这样读取文件:
data = json.loads(f.read())
但错误完全相同
在其他类似的主题中,我看到JSON中的“字典”已写入列表。我尝试过这样的事情:
data = json.loads([f.read()])
结果:
TypeError: the JSON object must be str, bytes or bytearray, not list
也:
data = json.load([f])
结果:
AttributeError: 'list' object has no attribute 'read'
我试图更改记录功能,但是我不能将所有内容都写到预先创建的字典中,所有内容都写在它的右边。像这样:
[]{"key": "Pepe", "value": "Pepeyaya"}{"key": "PepeHug", "value": "KekeHug"}{"key": "Pepega", "value": "Kekega"}{"key": "Pepe", "value": "Keke"}
代码:
import os
import tempfile
import json
import sys
def create_json(path):
with open(path, mode='a', encoding='utf-8') as f:
json.dump([], f)
def add(key, value, path):
with open(path, mode='a', encoding='utf-8') as f:
entry = {'key': key, 'value': value}
json.dump(entry, f)
def read(a_key, path):
read_result = ""
with open(path) as f:
data = json.load(f)
print(data)
my_list = data
for i in my_list:
for key, value in i.items():
if key == a_key:
read_result += value + ", "
print(value)
def main():
storage_path = os.path.join(tempfile.gettempdir(), 'storage.json')
if sys.argv[1] == "--key":
arg_key = sys.argv[2]
if len(sys.argv) <= 3:
read(arg_key, storage_path)
elif sys.argv[3] == "--value":
arg_value = sys.argv[4]
add(arg_key, arg_value, storage_path)
else:
print("Введите верные аргументы")
else:
print("Введите верные аргументы")
if __name__ == '__main__':
main()
通常,从所附代码中,现在出现此错误:
json.decoder.JSONDecodeError: Extra data: line 1 column 39 (char 38)
我需要根据要求:
python storage.py --key Pepe
获取Pepe和PepeYaya值
答案 0 :(得分:1)
这是一种基本的存储方法,这种方法对大型json文件非常不利,但是它是一个示例,说明了如何完成这项工作。
import os
import sys
import json
# storage.py key_name value
key =sys.argv[1]
value = sys.argv[2]
data_path = "data.json"
if os.path.isfile(data_path):
with open("data.json") as target:
json_data = json.load(target)
else:
json_data = {}
json_data[key] = value
with open("data.json", "w") as target:
json.dump(json_data, target)
在您的情况下,问题是因为打开文件时添加了附加标志。如果需要编写一个新对象,则需要删除json的最后一个'}',并在其后添加一个“,object”项,然后再次添加'}'char。