我无法读取JSON文件并从中获取数据

时间:2019-10-26 12:48:28

标签: python python-3.x

我想在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值

1 个答案:

答案 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。