python - 使用 Zipfile 和 Python 获取正确的目录结构

标签 python path python-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}

但是,我的代码在脚本所在的文件夹(级别 3)中生成 zip 文件,结果为 /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()

关于python - 使用 Zipfile 和 Python 获取正确的目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51644606/

相关文章:

python - 带有 R (rocker/r.base) 和 python 的 Docker 镜像在 EC2 上运行时无法工作,但本地就可以了

javascript - 鼠标移动时调整路径元素的大小

java - 无法从资源文件夹中读取文件

python - 使用 zipfile zlib python 和 mailgun 时,Mailgun 仅在 Python 脚本中发送部分 zip 文件

python - 如何将 Python StringIO() 对象传递给 ZipFile(),或者它是否不受支持?

python - 返回多边形 geopandas 内的点列表

java - Python 的检查样式

python - 如何处理 IndentationError : unindent does not match any outer indentation level

linux - 检测操作系统并在 R 中适当更改路径

python - 压缩文件 : how to set a password for a Zipfile?