[英]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.