2015-11-23 1 views
1

У меня есть файлы ~ 1GB * .tbz. Внутри каждого из этих файлов имеется один файл размером ~ 9 ГБ. Мне просто нужно прочитать заголовок этого файла, первые 1024 байта.Прочитать большой заголовок файла (~ 9 ГБ) внутри tarfile без полной извлечения

Я хочу, чтобы это сделало это как можно быстрее, поскольку у меня есть сотни этих 1GB-файлов, которые я хочу обработать. Для извлечения требуется около 1 м3.

Я попытался с помощью полного извлечения:

tar = tarfile.open(fn, mode='r|bz2') 
for item in tar: 
    tar.extract(item) 

и tarfile.getmembers(), но без скорости imprevement:

tar = tarfile.open(fn, mode='r|bz2') 
for member in tar.getmembers(): 
    f = tar.extractfile(member) 
    headerbytes = f.read(1024) 
    headerdict = parseHeader(headerbytes) 

getmembers() метод является то, что берет все время там.

Есть ли способ, которым я могу это сделать?

+0

Можете ли вы показать образец заголовка, который нужно проанализировать? –

+1

Можете ли вы использовать [BZ2File] (https://docs.python.org/2/library/bz2.html#bz2.BZ2File), чтобы «прочитать» кусок? Возможно, вы можете полностью пропустить часть «tar». – bbayles

+0

Спасибо! Это сработало! Вы хотите опубликовать полный ответ? f = bz2.BZ2File (fn); f.seek (512); headerbytes = f.read (1024); headerdict = parseHeader (headerbytes) – roho

ответ

1

Я думаю, вы должны использовать стандартную библиотеку bz2. .tbz - это расширение файла для файлов tar, которые сжимаются с помощью опции -j, чтобы указать формат bzip2.

Как @bbayles отметил в комментариях, вы можете открыть свой файл как bz2.BZ2File и использовать seek и read:

чтение ([размер])

Читайте в большинстве размера несжатых байт, возвращается как строка . Если аргумент размера отрицательный или пропущен, прочитайте до тех пор, пока EOF не достигнет .

Seek (смещение [, откуда])

Переход к новой позиции файла. Смещение аргумента - это счетчик байтов .

f = bz2.BZ2File(path) 
f.seek(512) 
headerbytes = f.read(1024) 

Вы можете разобрать, что с функциями.

headerdict = parseHeader(headerbytes) 
+0

Спасибо за полный ответ Себастьян! @bbayles дал первое руководство первым. Я фактически решил его с его комментарием, прежде чем вы отправили свой полный ответ. Я тоже хотел бы дать ему кредит. Вы знаете способ добавить его к вашему ответу? – roho

+0

Хорошо. Я просто сделал небольшое редактирование. Благодаря! – roho

1

Если вы уверены, что каждый tar-архив будет содержать только один файл bz2, вы можете просто пропустить первые 512 байт при первом чтении tar-файла (конечно, файл bz2, содержащийся в нем, конечно), потому что Формат tar-файла имеет заполненный (фиксированный размер) заголовок, после которого сохраняется ваше «реальное» содержимое.

Простой

f.seek(512) 

вместо цикла по getmembers() следует сделать трюк.

+0

Спасибо!Это был полезный, но не полный ответ. – roho

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