gzip python module is giving empty bytes

Question:

I copied one .gz file to a remote machine using fabric. When I tried to read the same remote file, empty bytes are getting displayed.

Below is the python code I used to read the zip file from remote machine.

try:
      fabric_connection = Connection(host = host_name, connect_kwargs = {'key_filename' : tmp_id, 'timeout' : 10})
      
      fd = io.BytesIO()
      remote_file = '/home/test/' + 'test.txt.gz'
      fabric_connection.get(remote_file, fd)

      with gzip.GzipFile(mode = 'rb', fileobj = fd) as fin:
         content = fin.read()
         print(content)
         decoded_content = content.decode()
         print(decoded_content)

   except BaseException as err:
      assert not err

   finally:
      fabric_connection.close()

It is giving below O/P:

b''

I verified on the remote machine and the content is present in the file.

Can some one please let me know how to fix this issue.

Asked By: kadina

||

Answers:

fabric_connect writes to fd, leaving the file pointer at end of file. You need to rewind to the front of your BytesIO file before handing it to GzipFile.

try:
    fabric_connection = Connection(host = host_name, connect_kwargs = {'key_filename' : tmp_id, 'timeout' : 10})
  
    fd = io.BytesIO()
    remote_file = '/home/test/' + 'test.txt.gz'
    fabric_connection.get(remote_file, fd)

    fd.seek(0)

    with gzip.GzipFile(mode = 'rb', fileobj = fd) as fin:
        content = fin.read()
    print(content)
    decoded_content = content.decode()
    print(decoded_content)

except BaseException as err:
    assert not err

finally:
    fabric_connection.close()
Answered By: tdelaney
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.