Python для создания нескольких zip-файлов для всех в папке - PullRequest
0 голосов
/ 10 мая 2019

Много файлов в папке. Я хочу застегнуть их всех. Каждые 10 файлов будут добавлены в zip-файл.

import os, glob
import numpy as np
import zipfile

file_folder = "C:\\ABC\\DEF\\"

all_files = glob.glob(file_folder + "/*.*")

several_lists= np.array_split(all_files, 10)

for num, file_names in enumerate(several_lists):
    ZipFile = zipfile.ZipFile(file_folder + str(num) + ".zip", "w" )

    for f in file_names:
        ZipFile.write(f, compress_type=zipfile.ZIP_DEFLATED)
        ZipFile.close()

Сгенерированные zip-файлы содержат также пути, то есть каждый zip-файл имеет папку DEF в папке ABC. Сами файлы находятся в DEF.

Я изменил строку на:

ZipFile.write(os.path.basename(f), compress_type=zipfile.ZIP_DEFLATED)

Ошибка появляется для:

WindowsError: [Error 2] The system cannot find the file specified:

Как это исправить? Спасибо.

Кстати, есть большая разница в zip и rar файлах, созданных Python?

1 Ответ

2 голосов
/ 10 мая 2019

ZipFile.write имеет параметр arcname, который позволяет явно указать имя файла в архиве (по умолчанию оно совпадает с путем на диске).

Поэтому просто используйте zip.write(f, arcname=os.path.basename(f)).

Также для простоты вы можете установить режим сжатия для редактирования zipfile.ZipFile.

: и вы можете использовать zipfile в качестве диспетчера контекста для большей надежности и меньшего количества строк, и предполагая, что Python 3.6 f-хорошие строки:

with zipfile.ZipFile(f'{file_folder}{num}.zip', 'w', compression=zipfile.ZIP_DEFLATED) as zip:
    for f in file_names:
        zip.write(f, arcname=os.path.basename(f))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...