python создание zip-файла целых каталогов, хранящихся в списке - индивидуально - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь автоматизировать сбор файлов и архивирование для моей работы. И у меня возникли некоторые проблемы. Я пытался использовать zipfile и shutil. Код ниже. У меня та же проблема с модулями. Я кормлю список каталогов, каждый из которых может содержать до 30 МБ файлов. Я хочу сжать каждый каталог со всеми его файлами и сохранить заархивированный файл в каталоге, который будет заархивирован.

Например:

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

проблема, кажется, заключается в том, что, когда я делаю рекомендуемые шаги в для l oop после сбора всех основных каталогов в список: [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-файл, который застревает ... и я смотрел, как он вырос до 6 Гб, прежде чем я убил его. и в этом каталоге с zip-файлом 6 ГБ самый большой размер файла был всего 230 КБ. Был в основном текстовые файлы. что тут происходит?

1 Ответ

0 голосов
/ 07 апреля 2020

Вместо использования shutil.make_archive вы можете использовать ZipFile (документация здесь ) для потоковой передачи ваших данных в zip-файл. Я попробовал это с несколькими каталогами, которые имеют .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)

Дайте мне знать, если это работает.

...