【问题标题】:Python3: f.read() in Tarfile returns bytes instead of a file-like object and it passes empty filePython3:Tarfile 中的 f.read() 返回字节而不是类似文件的对象,它传递空文件
【发布时间】:2020-08-07 09:15:28
【问题描述】:

我在 Python 中传递 tgz 文件的类文件对象时遇到问题。这是我的代码的样子:

backup = tarfile.open(backup_file, mode='r:gz')
for f in backup.getmembers():
    if f.name.endswith('.xml'):
        ff = f.name
        backupff = backup.extractfile(ff)
        if backupff:
            backupobj = backupff.read()
backup.close()

问题出在

backupobj = backupff.read()

它给出了这个错误:

AttributeError: 'bytes' 对象没有属性 'read'

我在处理 zip 文件时没有这样的问题。

更新

@AKX,你说得对,这不是我正在运行的代码。真正的代码非常大,我不确定是否有人有时间研究它。

无论如何,当我运行 main 函数时,我收到此错误:

file_read = file.read

AttributeError: 'bytes' 对象没有属性 'read'

这里是 file.read 部分:

def sendfile(self, file, offset=0, count=None):
        """Borrowed from https://github.com/python/cpython/blob/3.6/Lib/socket.py
        and adapted to our needs
        """
        self._check_sendfile_params(file, offset, count)
        if self.request.gettimeout() == 0:
            raise ValueError("non-blocking sockets are not supported")
        if offset:
            file.seek(offset)
        blocksize = min(count, 8192) if count else 8192
        total_sent = 0
        # localize variable access to minimize overhead
        file_read = file.read
        sock_send = self.request.send

【问题讨论】:

    标签: python tarfile bytesio


    【解决方案1】:

    我很肯定这不是您正在运行的代码,也不是您正在运行的环境。我无法使用 Python 3.8 重现这一点:

    $ echo aaa > 1.xml
    $ echo bbb > 2.xml
    $ tar czvf a.tar.gz *.xml
    a 1.xml
    a 2.xml
    $ cat x.py
    import tarfile
    
    backup_file = 'a.tar.gz'
    
    with tarfile.open(backup_file, mode='r:gz') as backup:
        for member in backup.getmembers():
            if member.name.endswith('.xml'):
                fh = backup.extractfile(member)
                if fh:
                    content = fh.read()
                    print((member.name, content))
    $ python3 x.py
    ('1.xml', b'aaa\n')
    ('2.xml', b'bbb\n')
    

    【讨论】:

    • 问题作者已在问题更新中回复。
    【解决方案2】:

    我找到了解决办法:

    无需使用以下命令:

    if backupff:
       backupobj = backupff.read()
    

    这一行足以将文件分配给外部用户

    backupff = backup.extractfile(ff)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-08
      • 2023-04-07
      • 2017-08-18
      • 2019-07-10
      • 2015-10-03
      • 1970-01-01
      相关资源
      最近更新 更多