Как добавить файл в файл tar, используя модуль tarfile python?

Я хочу добавить файл в файл tar. Например, файлы в test.tar.gz — это a.png, b.png, c.png. У меня есть новый png-файл с именем a.png, я хочу добавить к a.png до test.tar.gz и покрыть старый файл a.png в test.tar.gz. Мой код:

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

затем все файлы в test.tar.gz исчезли, но 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

В чем мои ошибки и что мне делать?

Обновить. Из документации следует, что файлы gz нельзя открывать в режиме a. Если да, то как лучше всего добавить или обновить файлы в существующем архиве?


person Karl Doenitz    schedule 06.02.2015    source источник


Ответы (2)


Из tarfile документации:

Обратите внимание, что 'a:gz' или 'a:bz2' невозможны. Если режим не подходит для открытия определенного (сжатого) файла для чтения, поднимается ReadError. Используйте режим 'r', чтобы избежать этого. Если метод сжатия не поддерживается, поднимается CompressionError.

Поэтому я думаю, вам следует распаковать его с помощью gzipбиблиотеки, добавить файлы с помощью a: режиме в tarfile, а затем снова сжать, используя gzip.

person Igor Hatarist    schedule 06.02.2015
comment
ОК, я понял. Я пренебрегаю примечанием, когда читаю документ по Python. - person Karl Doenitz; 06.02.2015
comment
Кто-нибудь знает, почему это так? Есть ли какая-то внутренняя проблема с точностью данных с append.gz или никто не удосужился добавить его в модуль Python? - person user1717828; 16.05.2017
comment
@user1717828 user1717828 Мне было любопытно, поэтому я спросил. Оказывается, сжатое добавление - довольно сложная задача, чтобы сделать это правильно. - person Jeyekomon; 12.09.2018

person    schedule
comment
Возможно, лучше использовать shutil для копирования файлов, по крайней мере, если они может иметь заметный размер. - person handle; 10.04.2018