簡體   English   中英

Python3:Tarfile 中的 f.read() 返回字節而不是類似文件的 object 並傳遞空文件

[英]Python3: f.read() in Tarfile returns bytes instead of a file-like object and it passes empty file

我在通過 Python 中的 tgz 文件的類似文件 object 時遇到問題。 這是我的代碼的樣子:

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' object 沒有屬性 'read'

我在處理 zip 文件時沒有這樣的問題。

更新

@AKX,你說得對,這不是我正在運行的代碼。 真正的代碼非常大,我不確定是否有人有時間研究它。

無論如何,當我運行主 function 時,我收到此錯誤:

file_read = file.read

AttributeError: 'bytes' object 沒有屬性 '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 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')

我找到了解決方案:

無需使用以下命令:

if backupff:
   backupobj = backupff.read()

此行足以將文件分配給外部用戶

backupff = backup.extractfile(ff)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM