使用tarfile.extractfile和Python3.8返回档案文件的名称,而不是档案文件的名称

问题描述 投票:0回答:1

我正在尝试获取mime类型,使用下一个代码读取和解析一些存档文件:

archive_file.tar.gz ---> file.csv,file.json,file.xlsx等

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返回为名称为ExFileObjectarchive_file.tar.gz,而不是以下档案库中文件的名称(例如:file.jsonfile.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时,文件名...

python python-3.x mime-types tarfile
1个回答
0
投票

ExFileObject是从基础文件句柄到压缩包的构造,而无需知道要提取的成员(只是告诉了要提取的成员的偏移量,大小和稀疏性)。因此,它不知道要提取的事物的名称,它仅具有原始tarball的名称,如图所示。

考虑到应该假设.name告诉您打开文件对象的文件系统名称,这样做可能是正确的,即使有些误导;您没有基于成员名称的实际文件系统对象的句柄,而只有tarball本身的句柄。调用extractfile时,您就可以访问该名称,因此,如果需要,请保留该信息。 extractfile的要点是获取数据,而不是毕竟存储它的名称。

© www.soinside.com 2019 - 2024. All rights reserved.