Использование tarfile.extractfile и Python3 .8 возвращает имя архива вместо архивированных файлов. - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь получить MIME-тип, прочитать и проанализировать некоторые архивные файлы, используя следующий код:

archive_file.tar.gz ---> file.csv, file. json, file.xlsx et c.

def parse_tar_gzip(element):

     from my_lib import parse_file
     from my_lib import NestedArchives

     try:
         tar = tarfile.open(fileobj=element, mode="r")
     except tarfile.ReadError:
         raise NestedArchives(element)
     else:
         for mem in tar.getmembers():
            if mem.isfile():
                my_mems = mem.name.split("/")[-1]
                if not my_mems.startswith("."):
                     my_file = tar.extractfile(mem)
                     # my_mime = mimetypes.guess_type(my_file)
                     print(my_file)

                     # yield "", parse_file(my_file)


with open('/Users/my_name/Downloads/archive_file.tar.gz', 'rb') as my_files:
    blabla = parse_tar_gzip(my_files)
    print(blabla)

Проблема в том, что my_file возвращается как ExFileObject с именем archive_file.tar.gz вместо имени файлов внутри архив (например: file.json или file.xlsx), как показано ниже:

<ExFileObject name='/Users/my_name/Downloads/archive_file.tar.gz'>
<ExFileObject name='/Users/my_name/Downloads/archive_file.tar.gz'>
<ExFileObject name='/Users/my_name/Downloads/archive_file.tar.gz'>
<ExFileObject name='/Users/my_name/Downloads/archive_file.tar.gz'>

Разве extractfile не должен возвращать имена файлов внутри архива? Это очень странно, потому что когда я использовал python2 .x, там были имена файлов ...

1 Ответ

0 голосов
/ 03 марта 2020

ExFileObject создается из основного дескриптора файла в tarball, не зная извлекаемого элемента (ему просто сообщают смещение, размер и разреженность извлекаемого элемента). Таким образом, он не знает имя извлекаемой вещи, он имеет только имя исходного архива, как показано на рисунке.

Учитывая, что .name должен сообщать вам имя файловой системы открытого файла объект, это возможно правильно, если несколько вводит в заблуждение, чтобы сделать это; у вас нет дескриптора фактического объекта файловой системы, основанного на имени члена, только дескриптор самого tarball. У вас есть доступ к имени в тот момент, когда вы звоните extractfile, поэтому просто держитесь за эту информацию, если вам это нужно. Смысл extractfile в том, чтобы получить данные, а не имя, под которым они были сохранены.

...