如何在temp文件夹中正确检查JSON文件是否没有空并从文件中加载JSON数据



问题是该过程永远不会从文件中通过"加载" JSON数据,我不明白为什么。它总是每次创建新文件。

import argparse
import os
import tempfile
import json
storage = argparse.ArgumentParser()
storage.add_argument("--key", help="input key's name")
storage.add_argument("--val", help="value of key", default=None)
args = storage.parse_args()
storage_path = os.path.join(tempfile.gettempdir(), 'storage.data')
with open(storage_path,'r') as f:
    if f.seek(2) is not 2:
        data_base = json.load(f)
        print('loaded that: ',data_base)
    else:
        f.close()
        print('each time I am creating the new one')
        with open(storage_path,'w') as f:
            data_base = {}
        f.close()
if data_base.get(args.key, 'Not found') == 'Not found': 
    if args.val is not None:
        data_base.setdefault(args.key, args.val)
        with open(storage_path, 'w') as f:
            json.dump(data_base, f)
            print('dumped this: ',data_base)

您的代码有很多问题,即

如果文件不存在,则程序崩溃:

with open(storage_path,'r') as f:

打开storage_path的写作,但实际上没有写任何东西:

    print('each time I am creating the new one')
    with open(storage_path,'w') as f:
        data_base = {}
    f.close()

实际上,如果您碰巧拥有f.seek(2) == 2,则json.load(f)也会崩溃,因为此时您将文件指针移动到第三个字符,因此随后的 json.load()中读取不会得到整个内容。

这是一个固定版本,应该有效:

import argparse
import os
import tempfile
import json
storage = argparse.ArgumentParser()
storage.add_argument("--key", help="input key's name")
storage.add_argument("--val", help="value of key", default=None)
args = storage.parse_args()
storage_path = os.path.join(tempfile.gettempdir(), 'storage.data')
data_base = None
if os.path.exists(storage_path):
    with open(storage_path,'r') as f:
        try:
            data_base = json.load(f)
            print('loaded that: ',data_base)
        except Exception as e:
            print("got %s on json.load()" % e)
if data_base is None:
    print('each time I am creating the new one')
    data_base = {}
    with open(storage_path,'w') as f:
        json.dump(data_base, f)
# don't prevent the user to set `"Not found" as value, if might
# be a legitimate value.
# NB : you don't check if `args.key` is actually set... maybe you should ?
sentinel = object()    
if data_base.get(args.key, sentinel) is sentinel:         
    if args.val is not None:
        data_base[args.key] = args.val
        with open(storage_path, 'w') as f:
            json.dump(data_base, f)
            print('dumped this: ',data_base)

最新更新