gzip a file in Python
Solution 1:
There is a module gzip. Usage:
Example of how to create a compressed GZIP file:
import gzip
content = b"Lots of content here"
f = gzip.open('/home/joe/file.txt.gz', 'wb')
f.write(content)
f.close()
Example of how to GZIP compress an existing file:
import gzip
f_in = open('/home/joe/file.txt')
f_out = gzip.open('/home/joe/file.txt.gz', 'wb')
f_out.writelines(f_in)
f_out.close()
f_in.close()
EDIT:
Jace Browning's answer using with
in Python >= 2.7 is obviously more terse and readable, so my second snippet would (and should) look like:
import gzip
with open('/home/joe/file.txt', 'rb') as f_in, gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:
f_out.writelines(f_in)
Solution 2:
Read the original file in binary (rb
) mode and then use gzip.open
to create the gzip file that you can write to like a normal file using writelines
:
import gzip
with open("path/to/file", 'rb') as orig_file:
with gzip.open("path/to/file.gz", 'wb') as zipped_file:
zipped_file.writelines(orig_file)
Even shorter, you can combine the with
statements on one line:
with open('path/to/file', 'rb') as src, gzip.open('path/to/file.gz', 'wb') as dst:
dst.writelines(src)
Solution 3:
Try this:
check_call(['gzip', fullFilePath])
Depending on what you're doing with the data of these files, Skirmantas's link to http://docs.python.org/library/gzip.html may also be helpful. Note the examples near the bottom of the page. If you aren't needing to access the data, or don't have the data already in your Python code, executing gzip may be the cleanest way to do it so you don't have to handle the data in Python.
Solution 4:
From the docs for Python3
Gzip an existing file
import gzip
import shutil
with open('file.txt', 'rb') as f_in:
with gzip.open('file.txt.gz', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
Or if you hate nested with
statements
import gzip
import shutil
from contextlib import ExitStack
with ExitStack() as stack:
f_in = stack.enter_context(open('file.txt', 'rb'))
f_out = stack.enter_context(gzip.open('file.txt.gz', 'wb'))
shutil.copyfileobj(f_in, f_out)
Create a new gzip file:
import gzip
content = b"Lots of content here"
with gzip.open("file.txt.gz", "wb") as f:
f.write(content)
Note the fact that content
is turned into bytes
Another method for if you aren't creating content as a string/byte literal like the above example would be
import gzip
# get content as a string from somewhere else in the code
with gzip.open("file.txt.gz", "wb") as f:
f.write(content.encode("utf-8"))
See this SO question for a discussion of other encoding methods.
Solution 5:
Use the gzip module:
import gzip
import os
in_file = "somefile.data"
in_data = open(in_file, "rb").read()
out_gz = "foo.gz"
gzf = gzip.open(out_gz, "wb")
gzf.write(in_data)
gzf.close()
# If you want to delete the original file after the gzip is done:
os.unlink(in_file)
Your error: OSError: [Errno 2] No such file or directory'
is telling you that the file fullFilePath
does not exist. If you still need to go that route, please make sure that file exists on your system and you are using an absolute path not relative.