使用Python中的Zipfile获取正确的目录结构

使用Python中的Zipfile获取正确的目录结构,python,path,zipfile,Python,Path,Zipfile,我有一个类似于/level1/level2/level3/level4/level5的目录结构,在level5中我有.json文件,我想用压缩版本替换,以便 /level1/level2/level3/level4/level5/{file1.json,file2.json,file3.json} /level1/level2/level3/level4/level5/{file1.zip、file2.zip、file3.zip} 但是,我的代码在脚本所在的文件夹中生成zip文件,即级别3,结果

我有一个类似于
/level1/level2/level3/level4/level5
的目录结构,在level5中我有.json文件,我想用压缩版本替换,以便
/level1/level2/level3/level4/level5/{file1.json,file2.json,file3.json}
/level1/level2/level3/level4/level5/{file1.zip、file2.zip、file3.zip}

但是,我的代码在脚本所在的文件夹中生成zip文件,即级别3,结果是
/level1/level2/[level3]{file1.zip、file2.zip、file3.zip}/level4/level5/{file1.json、file2.json、file3.json}

此外,如果我解压缩文件,我会得到整个目录结构,而不仅仅是文件。例如,如果我解压缩file1.zip,我会得到
/level1/level2/[level3]{(/level1/level2/level3/level4/level5/file1.json),file2.zip,file3.zip}/level4/level5/{file1.json,file2.json,file3.json}

我尝试过不同的论点,但我不确定如何得到我想要的结果。我怎样才能做到这一点

这是我目前的代码

        path = os.path.join(
            os.path.dirname(os.path.abspath(__file__)),
            level4, level5)

        for root, dirs, files in os.walk(path, topdown=True):
            print('This is root: ', root)
            for file in files:
                zf = zipfile.ZipFile(
                    '{}.zip'.format(file[:-5]), 'w',
                    zipfile.ZIP_DEFLATED)
                zf.write(os.path.join(root, file))
                zf.close()

您应该使用连接的根路径创建zip文件,以便在JSON文件所在的位置创建zip文件,并且在将JSON文件写入zip文件时,使用
writestr
方法而不是
write
,以便您可以使用所需的路径名命名文件,在本例中,它只是一个完全没有路径名的文件名:

for root, dirs, files in os.walk(path, topdown=True):
    print('This is root: ', root)
    for file in files:
        zf = zipfile.ZipFile(os.path.join(root, '{}.zip'.format(file[:-5])), 'w', zipfile.ZIP_DEFLATED)
        zf.writestr(file, open(os.path.join(root, file)).read())
        zf.close()