I want to append a file to the tar file. For example, the files in test.tar.gz
are a.png, b.png, c.png
. I have a new png file named a.png
, I want to append to a.png
to test.tar.gz
and cover the old file a.png
in test.tar.gz
. My code:
import tarfile
a = tarfile.open('test.tar.gz', 'w:gz')
a.add('a.png')
a.close()
then, all the files in test.tar.gz
disappeard but a.png
, if I change my code to this:
import tarfile
a = tarfile.open('test.tar.gz', 'a:')# or a:gz
a.add('a.png')
a.close()
the program is crashed, error log:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/tarfile.py", line 1678, in open
return func(name, filemode, fileobj, **kwargs)
File "/usr/lib/python2.7/tarfile.py", line 1705, in taropen
return cls(name, mode, fileobj, **kwargs)
File "/usr/lib/python2.7/tarfile.py", line 1588, in __init__
raise ReadError(str(e))
tarfile.ReadError: invalid header
What are my mistakes and what should I do?
Update. From the documentation, it follows that gz
files cannot be open in a
mode. If so, what is the best way to add or update files in an existing archive?
From tarfile
documentation:
Note that
'a:gz'
or'a:bz2'
is not possible. If mode is not suitable to open a certain (compressed) file for reading,ReadError
is raised. Use mode 'r' to avoid this. If a compression method is not supported,CompressionError
is raised.
So I guess you should decompress it using gzip
library, add the files using the a:
mode in tarfile
, and then compress again using gzip
.