Я использую zipfile
для создания архива всех файлов в каталоге (рекурсивно, с сохранением структуры каталогов, включая пустые папки) и хочу, чтобы процесс пропускал имена файлов, указанные в списке.
Это базовая функция, которая выполняет os.walking по каталогу и добавляет все содержащиеся в нем файлы и каталоги в архив.
def zip_dir(path):
zipname = str(path.rsplit('/')[-1]) + '.zip'
with zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) as zf:
if os.path.isdir(path):
for root, dirs, files in os.walk(path):
for file_or_dir in files + dirs:
zf.write(os.path.join(root, file_or_dir),
os.path.relpath(os.path.join(root, file_or_dir),
os.path.join(path, os.path.pardir)))
elif os.path.isfile(filepath):
zf.write(os.path.basename(filepath))
zf.printdir()
zf.close()
Мы видим, что код также должен иметь возможность обрабатывать отдельные файлы, но этоглавным образом, часть, касающаяся каталогов, которые нас интересуют.
Теперь, допустим, у нас есть список имен файлов, которые мы хотим исключить из добавления в zip-архив.
skiplist = ['.DS_Store', 'tempfile.tmp']
Что такоелучший и самый чистый способ достичь этого?
Я попытался использовать zip
, который был несколько успешным, но по какой-то причине он исключает пустые папки (должны быть включены пустые папки).Я не уверен, почему это происходит.
skiplist = ['.DS_Store', 'tempfile.tmp']
for root, dirs, files in os.walk(path):
for (file_or_dir, skipname) in zip(files + dirs, skiplist):
if skipname not in file_or_dir:
zf.write(os.path.join(root, file_or_dir),
os.path.relpath(os.path.join(root, file_or_dir),
os.path.join(path, os.path.pardir)))
Было бы также интересно узнать, есть ли у кого-нибудь умная идея по добавлению возможности пропускать определенные расширения файлов, возможно, что-то вроде .endswith('.png')
, но я 'Я не совсем уверен, как включить его вместе с существующим скиплистом.
Буду также признателен за любые другие общие замечания относительно функции и, если она действительно работает, как ожидается, без сюрпризов, а также за любые предложения по оптимизации илиулучшения.