2010-08-04 1 views
2

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

def write(filename, offset, data) 
    file.open(filename, "ab") 
    file.seek(offset) 
    file.write(data) 
    file.close() 

Скажем, у меня есть 32KB запись (е , o, d) при смещении 1 МБ в файл, а затем еще 32 КБ записи (f, o, d) со смещением 0

В итоге я получаю файл длиной 65 КБ (т. е. промежуток, состоящий из 0 с между 32 КБ - 1 МБ, усекается/исчезает)

Я знаю, что это может показаться невероятно глупым вопросом, но я не могу его изобразить из режимов file.open (..)

Совет с благодарностью получил.

*** UPDATE

Мой метод писать P2P части кончался следующим образом (для тех, кто может почерпнуть какую-то ценность от него)

def writePiece(self, filename, pieceindex, bytes, ipsrc, ipdst, ts): 
    file = open(filename,"r+b") 
    if not self.piecemap[ipdst].has_key(pieceindex): 
     little = struct.pack('<'+'B'*len(bytes), *bytes) 
     # Seek to offset based on piece index 
     file.seek(pieceindex * self.piecesize) 
     file.write(little) 
     file.flush() 
     self.procLog.info("Wrote (%d) bytes of piece (%d) to %s" % (len(bytes), pieceindex, filename)) 

    # Remember we have this piece now in case duplicates arrive 
    self.piecemap[ipdst][pieceindex] = True 
    file.close() 

Примечание: Я также рассмотрел некоторые вопросы порядком байт, используя-структуру .pack, который мучил меня некоторое время.

Для кого-то интересно, проект, над которым я работаю, - это анализировать сообщения BT, записанные непосредственно с провода.

+0

Вы не 'искали' до конца и писать там до закрытия? –

+0

Этот код не запускается. Каков фактический код, который вы используете? –

+0

Мне нужен сон - это такой любопытный вопрос, который я не могу поверить, я спросил его. Извиняюсь. Мне нужно было использовать: file.open («r + b») для достижения моей намеченной цели. – codeasone

ответ

6
>>> import os 
>>> filename = 'tempfile' 
>>> def write(filename,data,offset): 
...  try: 
...   f = open(filename,'r+b') 
...  except IOError: 
...   f = open(filename,'wb') 
...  f.seek(offset) 
...  f.write(data) 
...  f.close() 
... 
>>> write(filename,'1' * (1024*32),1024*1024) 
>>> write(filename,'1' * (1024*32),0) 
>>> os.path.getsize(filename) 
1081344 
4

Вы открыли файл в режиме добавления ("a"). Все записи идут в конец файла, независимо от вызовов seek().

+0

Извините за мою поспешность при вводе кода. Чтобы создать файл с фрагментами данных в разных смещениях и заполнить нулями, я использовал режим file.open («r + b») и просто искал и написал данные в файл по мере необходимости. – codeasone

0

Попробуйте использовать 'r + b', а не 'ab'.

0

Мне кажется, что нет смысла пытаться собрать файл, пока все его части не будут найдены. Почему бы не разделить куски до тех пор, пока все не присутствуют, а затем напишите их в окончательный файл по порядку? Это то, что делают большинство приложений P2P, AFAIK.

+0

Вы думаете, что это то, что делает bittorrent с загрузкой 2 ГБ? Что вы делаете, чтобы держать куски в памяти? – MattH

+0

Сохраните каждую часть, как она получена, в отдельный файл, а затем слейте, когда закончите. Кажется, я помню, что это, например, Limewire делает, но я не знаю о большинстве торрент-клиентов. –