Python3: f.read () в Tarfile возвращает байты вместо файлового объекта и передает пустой файл - PullRequest
0 голосов
/ 07 августа 2020

У меня проблема с передачей файлового объекта tgz-файла в Python. вот как выглядит мой код:

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-файлами.

Update

@ AKX, вы правы это не тот код, который я использую. Настоящий код очень большой, и я не уверен, что у кого-то есть время его изучить.

В любом случае, когда я запускаю основную функцию, я получаю эту ошибку:

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

Ответы [ 2 ]

0 голосов
/ 10 августа 2020

Я нашел решение:

Нет необходимости использовать следующие команды:

if backupff:
   backupobj = backupff.read()

Этой строки достаточно, чтобы назначить файл внешнему пользователю

backupff = backup.extractfile(ff)
0 голосов
/ 07 августа 2020

Я совершенно уверен, что это не тот код, который вы используете, или не среда, в которой вы работаете. Я не могу воспроизвести это с помощью 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')
...