2015-01-05 6 views
0

Я пытаюсь читать много bz2 файлов в архивный файл, файл имеет следующую структуру:Чтение отдельных bz2 файлов из дегтя файла

2013-01.tar 
    01\01\00\X.json.bz2\X.json 
    01\01\02\X.json.bz2\X.json 

Я могу получить имена файлов следующим образом:

import tarfile 
tar = tarfile.open(filepath, 'r') 
tar_members_names = [filename for filename in tar.getnames()] 
# Side question: How would I only return files and no directories? 

который возвращает список .bz2 файлов. Теперь я пытаюсь извлечь их (временно) с помощью:

inner_filename = tar_members_names[0] 
t_extract = tar.extractfile(inner_filename) 

Следующий код для извлечения файла JSon возвращает ошибку, однако. Как я могу найти файлы JSON по строкам?

import bz2 
txt = bz2.BZ2File(t_extract) 
TypeError: coercing to Unicode: need string or buffer, ExFileObject found 
txt = bz2.decompress(t_extract) 
TypeError: must be convertible to a buffer, not ExFileObject 

Я не мог понять, как вернуть буфер из гудрона файла вместо текущего ExFileObject (как преобразовать его в буфер?), Любые предложения очень ценятся.

+0

как ошибка говорит, вы передаете ExFileObject, а не строку или объект TarInfo, например, «extractfile» ожидает. –

ответ

2

BZ2File ожидает имя файла в качестве первого аргумента, и вы передачи файла объекта (то есть объект, который имеет тот же интерфейс, как то, что возвращает Python для open()).

Чтобы сделать то, что вы хотите, вы должны прочитать все байты из t_extract себя и вызвать bz2.decompress(data) или использовать BZ2Decompressor для потоковой передачи данных через него.

+0

Спасибо за ответ, он очищает то, что происходит не так. Не могли бы вы дать подсказку, где я могу найти, как это сделать? Должен ли я сначала сохранить извлеченный файл на диск и прочитать его оттуда? – MattV

+0

Это немного зависит от размера файла. Если он мал, вы можете прочитать все его в буфер ('data = t_extract.read()') и распаковать с одним вызовом 'bz2.decompress (data)'. В противном случае вы должны использовать временный файл и передавать данные через 'BZ2Decompressor' –

+0

Спасибо за разъяснение. Они достаточно малы, поэтому буфер должен работать. – MattV

Смежные вопросы