2010-03-02 2 views
9

Скажем, у меня есть двоичный файл размером 12 ГБ, и я хочу срезать 8 ГБ из середины его. Я знаю индексы позиций, которые хочу сократить между ними.Python: нарезка очень большого двоичного файла

Как это сделать? Очевидно, что 12 ГБ не поместится в память, это нормально, но 8 ГБ тоже не будет ... Что я думал, все в порядке, но кажется, что двоичный код, похоже, не нравится, если вы делаете это в кусках! Я добавлял 10 Мбайт одновременно к новому двоичному файлу, и на новом краю каждого фрагмента 10 МБ есть разрывы.

Есть ли способ сделать это с помощью Pythonic?

ответ

8

Вот краткий пример. Адаптировать при необходимости:

def copypart(src,dest,start,length,bufsize=1024*1024): 
    with open(src,'rb') as f1: 
     f1.seek(start) 
     with open(dest,'wb') as f2: 
      while length: 
       chunk = min(bufsize,length) 
       data = f1.read(chunk) 
       f2.write(data) 
       length -= chunk 

if __name__ == '__main__': 
    GIG = 2**30 
    copypart('test.bin','test2.bin',1*GIG,8*GIG) 
+0

я сделал что-то очень похожее, чем это, и это, похоже, не нравится, с бинарным, если вы извлечь блок данных из середины не может иногда испортить по краям так как нужно, чтобы его окружающие байты имели смысл? Хм. Я попробую ваш код, хотя ура. Также вы получили свою длину и забросили неправильный путь в последней строке вашего кода? –

+0

Это начало и длина ... последняя строка использует значение по умолчанию для bufsize. Я не уверен, что вы подразумеваете под «беспорядками по краям». Если вам нужны окружающие байты, возможно, ваш старт и длина неверны? –

+0

Вы правы! Я перепутал себя, все работает сейчас :) Каков оптимальный размер буфера для передачи файлов? 1MB хорошо? –

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