Я хочу добавить файлы из каталога в сжатый архив, но выбираю только те файлы, у которых в имени есть «a» (например).
Аргумент filter
для Tarfile
объекты выглядят подходящими для такой фильтрации.
Проблема в том, что функция filter
, похоже, не содержит никакой информации.
Я создал простой пример для воспроизведения:
поместите два файла в тестовую директорию, скажем, foo
и bar
добавьте этот скрипт Python (просто измените путь ккаталог теста WD
):
#!/usr/bin/env python3
import os
import tarfile
WD = '/home/nico/temp/essai_py/directory'
def __tar_filter(tar_info):
print('\ntar_info={}\n'.format(repr(tar_info)))
print('\ntar_info.name={}\n'.format(tar_info.name))
if 'a' in tar_info.name:
return tar_info
return None
with tarfile.open('dest.tgz', 'w:gz') as tar:
for f in os.listdir(WD):
tar.add(os.path.join(WD, f), arcname=os.path.sep, filter=__tar_filter)
Теперь, когда я запускаю этот скрипт, я получаю:
tar_info=<TarInfo '' at 0x7f1f7ffbfa70>
tar_info.name=
tar_info=<TarInfo '' at 0x7f1f7ffbfa70>
tar_info.name=
И, конечно же, dest.tgz
пусто (имена не указаны, поэтому каждый раз возвращается None
).
Странно, функция фильтрации была дважды предоставлена одному и тому же объекту TarInfo
, поэтому я кое-что не могу хорошо понять здесь.
Конечно, для этой ситуации я могу сам фильтровать имена файлов при создании списка файлов (это невопрос), но не могу ли я использовать аргумент filter
для той же цели?