2015-02-06 104 views
3

我想追加一个文件到tar文件。例如,test.tar.gz中的文件是a.png, b.png, c.png。我有一个名为a.png的新PNG文件,我想追加到a.pngtest.tar.gz,并覆盖中的旧文件a.png。我的代码:如何将文件追加到tar文件使用python tarfile模块?

import tarfile 
a = tarfile.open('test.tar.gz', 'w:gz') 
a.add('a.png') 
a.close() 

然后,所有的文件test.tar.gz disappeard但a.png,如果我我的代码改成这样:

import tarfile 
a = tarfile.open('test.tar.gz', 'a:')# or a:gz 
a.add('a.png') 
a.close() 

程序崩溃,错误日志:

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 

我的错误是什么?我该怎么做?

回答

4

tarfile documentation

注意'a:gz''a:bz2'是不可能的。如果模式不适合打开某个(压缩)文件进行读取,则会引发ReadError。使用模式'r'来避免这种情况。如果不支持压缩方法,则会引发CompressionError

所以我猜你应该使用gzip library解压,在tarfile添加使用a:模式的文件,然后使用gzip压缩一次。

+1

好的,我明白了。当我阅读python文档时忽略了笔记。 – 2015-02-06 09:14:05

+1

有谁知道这是为什么? append.gz是否存在一些内在的数据保真度问题,还是没有人将它添加到Python模块? – user1717828 2017-05-16 12:05:52