Распаковка .bz2 файла в Python

Журнал ASPects ASP имеет подробное описание о том, как подписать код (Необходимо быть участником для чтения статьи). Можно загрузить его до , http://www.asp-shareware.org/

Вот является ссылкой на описание, как Вы можете делать свое собственное свидетельство об испытании .

Это могло бы также быть интересно.

6
задан Uli Köhler 8 February 2015 в 14:14
поделиться

2 ответа

Вы открываете и читаете сжатый файл, как если бы это был текстовый файл, состоящий из строк. НЕ! Это НЕ.

uncompressedData = bz2.BZ2File(zipFile).read()

кажется ближе к тому, на что вы ловите.

Правка : ОП показал еще несколько вещей, которые он пробовал (хотя я не вижу никаких заметок о том, что пробовал лучшее метод - однострочный, который я рекомендую выше!), но, похоже, все они имеют одну общую ошибку, и я повторяю ключевые биты сверху:

открытие ... сжатый файл, как если бы это был текстовый файл ... Это НЕ.

open (filename) и даже более явный open (filename, 'r') open для чтения text - сжатый файл представляет собой двоичный файл, поэтому для правильного чтения вы должны открыть его с помощью open (filename, 'rb') . ((рекомендуемый мной bz2.BZ2File ЗНАЕТ, что имеет дело со сжатым файлом, конечно, поэтому нет необходимости рассказывать больше)).

В Python 2. * , в системах Unix-y (то есть во всех системах, кроме Windows) вы можете избежать небрежного использования open (но в Python 3. * вы не можете, поскольку текст - это Unicode, а двоичный - это байты - разные типы).

В Windows (и до этого в DOS) это ' всегда было необходимо различать, поскольку текстовые файлы Windows по историческим причинам являются своеобразными (используйте два байта, а не один в конце строки и, по крайней мере, в некоторых случаях, берите значение байта '\ 0x1A' , что означает логический конец файла), поэтому чтение и запись низкоуровневого кода должны компенсировать.

Поэтому я подозреваю, что OP использует Windows и расплачивается за неосторожное использование 'rb' Опция («чтение двоичного кода») для open встроенной. (хотя bz2.BZ2File все еще проще, какую бы платформу вы ни использовали! -).

означает логический конец файла), поэтому чтение и запись низкоуровневого кода должны компенсировать.

Поэтому я подозреваю, что OP использует Windows и расплачивается за неосторожное использование 'rb ' опция ("чтение двоичного кода") для open встроенной. (хотя bz2.BZ2File все еще проще, какую бы платформу вы ни использовали! -).

означает логический конец файла), поэтому чтение и запись низкоуровневого кода должны компенсировать.

Поэтому я подозреваю, что OP использует Windows и расплачивается за неосторожное использование 'rb ' опция ("чтение двоичного кода") для open встроенной. (хотя bz2.BZ2File все еще проще, какую бы платформу вы ни использовали! -).

14
ответ дан 8 December 2019 в 03:27
поделиться

openZip = open (zipFile, "r")

Если вы работаете в Windows, вы можете сказать здесь openZip = open (zipFile, "rb") , поскольку файл, скорее всего, будет содержать комбинации CR / LF, а вы не хотите, чтобы они были переведены.

newLine = openZip.readline ()

Как заметил Алекс, это очень неправильно, поскольку концепция «строк» ​​чужда сжатому потоку.

s = fileHandle. читать (1024) [...] uncompressedData + = bz2.decompress (s)

Это неверно по той же причине. Блоки размером 1024 байта вряд ли будут иметь большое значение для декомпрессора, поскольку он захочет работать с собственным размером блока.

s = fileHandle.read () uncompressedData = bz2.decompress (s)

Если это не сработает, я бы сказал, что это проблема перевода новой строки, о которой я упоминал выше.

9
ответ дан 8 December 2019 в 03:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: