Как использовать аргумент фильтра в tarfile.add ()? - PullRequest
0 голосов
/ 17 октября 2018

Я хочу добавить файлы из каталога в сжатый архив, но выбираю только те файлы, у которых в имени есть «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 для той же цели?

...