python生成单独存储在列表中的整个目录的zip文件

2024-06-26 14:55:09 发布

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

我正在尝试为我的工作自动化一些文件收集和压缩。 我遇到了一些麻烦。 我试过使用zipfile和shutil。代码如下。 我在模块上也有同样的问题。 我提供了一个目录列表,每个目录最多有30mb的文件。 我想压缩每个目录及其所有文件,并将压缩后的文件保存在正在压缩的目录中

例如:

+
|____dir_a
|        |__file_a
|        |__file_b
|        |__dir_a.zip
|
|____dir_b
         |___file_ba
         |___file_bb
         |___file_bc
         |___dir_b.zip

问题似乎是,当我在将所有主目录收集到一个列表中之后在for循环中执行建议的步骤时:[dir_a, dir_b] 拉链似乎从未停止过。在我看来,好像是想把每个文件压缩成一个大文件?或者只是不断地重复压缩同一个目录?我不知道发生了什么事。但它会一直运行,直到耗尽所有的磁盘空间

下面是我使用的看似简单的代码:

def main(directory):

    if directory[-1] in ['/', '\\']:
        directory = directory[:-1]

    # Call the function to retrieve all files and folders of the assigned directory
    filePaths = [f.path for f in os.scandir(directory) if f.is_file()]

    # Set the zip file name
    zipFileName = os.path.split(directory)[-1] + ".zip"

    # printing the list of all files to be zipped
    print('The following list of files will be zipped:')
    for fileName in filePaths:
        print(fileName)

    # # writing files to a zipfile
    # with zipfile.ZipFile(directory + '/' + zipFileName, 'w', zipfile.ZIP_DEFLATED) as zip_file:
    #     # writing each file one by one
    #     for file in filePaths:
    #         zip_file.write(file)
    # print(directory+'.zip file is created successfully!')

    shutil.make_archive(directory + '/' + zipFileName[:-4], 'zip', directory)

    return directory + '/' + zipFileName

root = '/opt/folder_a/nested_folder/
for directory in [root + 'dir_a/', root + 'dir_b/']:
    main(directory)

所以我发现,如果有超过5个目录,zip文件大部分都很小。 但是偶尔会有zip文件,它会被卡住。。。在我杀死它之前,我看着它增长到6gb左右。 在这个有6gb zip文件的目录中,最大的文件大小只有230kb。 主要是文本文件。这里发生了什么事


Tags: 文件ofthetoin目录fordir
1条回答
网友
1楼 · 发布于 2024-06-26 14:55:09

您可以使用ZipFile(文档here)将数据流式传输到zip文件中,而不是使用shutil.make_archive。我用几个有.zip个文件和.tar.gz的目录试用了一下,效果很好

在你的情况下可能是这样


from zipfile import ZipFile

# create a ZipFile object
with ZipFile('sampleDir.zip', 'w') as zipObj:
   # Iterate over all the files in directory
   for folderName, subfolders, filenames in os.walk(dirName):
       for filename in filenames:
           #create complete filepath of file in directory
           filePath = os.path.join(folderName, filename)
           # Add file to zip
           zipObj.write(filePath)

让我知道这是否有效

相关问题 更多 >