2013-05-23 2 views
2

Я пытаюсь извлечь сжатую папку bz2 в определенном месте. я могу видеть данные изнутри:Извлечение сжатой папки BZ2 с использованием Python

handler = bz2.BZ2File(path, 'r') 
print handler.read() 

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

Я довольно новый для этого языка .. Пожалуйста, помогите ...

ответ

4

Как и gzip, BZ2 - это только компрессор для одиночных файлов, он не может архивировать структуру каталогов. Я подозреваю, что у вас есть архив, который сначала создается с помощью программного обеспечения, такого как tar, которое затем сжимается BZ2. Чтобы восстановить «полную структуру каталогов», сначала извлеките свой Bz2-файл, затем де-tar (или эквивалентный) файл.

К счастью, модуль Python tarfile поддерживает опцию bz2, поэтому вы можете сделать этот процесс одним выстрелом.

+0

И как мне это сделать? извлечение части BZ2 файла? Есть ли функция, через которую я непосредственно получаю несжатый файл, или мне нужно сначала прочитать файл bz2, а затем записать эти данные в какой-либо другой файл? – user2413801

+0

Откройте файл tar.bz, как если бы это был обычный tar-файл. Модуль tarfile для Python позаботится об остальном. – zmbq

1

bzip2 представляет собой систему сжатия данных, которая сжимает один файл целиком. Он не связывает файлы и сжимает их, как PKZip. Поэтому handler в вашем примере имеет один и только один файл в нем, и нет «внутренней структуры каталогов».

Если, с другой стороны, ваш файл на самом деле является сжатым tar-файлом, вы должны посмотреть на tarfile module Python, который будет обрабатывать декомпрессию для вас.

1

Вы должны использовать tarfile модуль для распаковки .tar.bz2 файла ... из документации вот как вы можете это сделать:

import tarfile 
tar = tarfile.open(path, "r:bz2") 
for tarinfo in tar: 
    print tarinfo.name, "is", tarinfo.size, "bytes in size and is", 
    if tarinfo.isreg(): 
     print "a regular file." 
     # read the file 
     f = tar.extractfile(tarinfo) 
     print f.read() 
    elif tarinfo.isdir(): 
     print "a directory." 
    else: 
     print "something else." 
tar.close() 
Смежные вопросы