如何修复使用JSON字典读取/写入的文件跟踪程序?

2024-05-04 12:36:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个脚本,跟踪安装程序创建的多个文件路径的目录/文件中所做的更改。我在git上找到了Thomas Sileo的DirTools项目,并对其进行了修改,但现在在编写/读取JSON时遇到了一些问题:

1)首先,我认为我对JSON的编写是错误的,我发现我的create_state()函数只编写了我需要的最后一条路径

2)如果我让它工作,我将无法像以前那样读取/解析文件。我通常会得到ValueError:额外的数据错误

代码如下:

import os import json import getpass


files = [] subdirs = []

USER = getpass.getuser()

pathMac = ['/Applications/',
           '/Users/' + USER + '/Documents/' ]

def create_dir_index(path):
    files = []
    subdirs = []

    for root, dirs, filenames in os.walk(path):
        for subdir in dirs:
            subdirs.append(os.path.relpath(os.path.join(root, subdir), path))

        for f in filenames:
            files.append(os.path.relpath(os.path.join(root, f), path))

    return dict(files=files, subdirs=subdirs)

def create_state(): for count in xrange(len(pathMac)):

        dir_state = create_dir_index(pathMac[count])
        out_file = open("Manifest.json", "w")
        json.dump(dir_state, out_file)
    out_file.close()


def compare_states(dir_base, dir_cmp):
    '''
    return a comparison two manifest json files
    '''

    data = {}

    data['deleted'] = list(set(dir_cmp['files']) - set(dir_base['files']))
    data['created'] = list(set(dir_base['files']) - set(dir_cmp['files']))

    data['deleted_dirs'] = list(set(dir_cmp['subdirs']) - set(dir_base['subdirs']))
    data['created_dirs'] = list(set(dir_base['subdirs']) - set(dir_cmp['subdirs']))

    return data

if __name__ == '__main__':

    response = raw_input("Would you like to Compare or Create? ")

    if response == "Create":
        # CREATE MANIFEST json file
        create_state()
        print "Manifest file created."
    elif response == "Compare":
        # create the CURRENT state of all indexes in pathMac and write to json file
        for count in xrange(len(pathMac)):
            dir_state = create_dir_index(pathMac[count])
            out_file = open("CurrentState.json", "w")
            json.dump(dir_state, out_file)
        out_file.close()

        # Open and Load the contents from the file into dictionaries
        manifest = json.load(open("Manifest.json", "r"))
        current = json.load(open("CurrentState.json", "r"))

        print compare_states(current, manifest)

Tags: pathinjsonfordataoscreatedir