Проблема связана с использованием вами режима добавления, в результате чего файлы содержат несколько сжатых блоков данных. Посмотрите на этот пример:
>>> import codecs
>>> with codecs.open("myfile.zip", "a+", "zip") as f:
>>> f.write("ABCD")
В моей системе получается файл размером 12 байт. Посмотрим, что в нем содержится:
>>> with codecs.open("myfile.zip", "r", "zip") as f:
>>> f.read()
'ABCD'
Хорошо, теперь давайте сделаем еще одну запись в режиме добавления:
>>> with codecs.open("myfile.zip", "a+", "zip") as f:
>>> f.write("EFGH")
Размер файла теперь составляет 24 байта, а его содержимое:
>>> with codecs.open("myfile.zip", "r", "zip") as f:
>>> f.read()
'ABCD'
Что здесь происходит, так это то, что unzip ожидает один сжатый поток. Вам придется проверить спецификации, чтобы увидеть, каково официальное поведение с несколькими объединенными потоками, но по моему опыту они обрабатывают первый и игнорируют остальные данные. Вот что делает Python.
Я ожидаю, что bunzip2 делает то же самое. Таким образом, в действительности ваш файл сжат и намного меньше, чем содержащиеся в нем данные. Но когда вы запускаете его через bunzip2, вы получаете только первый набор записей, которые вы записали в него; остальное отбрасывается.