2017-04-23 85 views
2

我实际上正在使用UDP发送文件的项目,并且由于此协议不可靠,我在每个数据包上添加了一些信息,这些信息是数据的索引。所以我可以按正确的顺序写入收到的数据。 我有问题写在特定位置字节文件seek函数无法更新文件在特定位置 - python

这是处理新数据写入我的代码的一部分:在这种情况下

while i < packet_num: 
    buf,address = recieve_packet(s,data_size+10) 
    i += 1 
    if buf: 
     print(buf) 
     index = int(buf[0:10].decode()) 
     data = buf[10:] 
     f.seek(seek_pointer + index*data_size,0) 
     f.write(data) 
     list_index.append(index) 

的搜索功能没有任何影响,该数据只是附加到文件中。我正在使用“a + b”模式打开文件。

回答

2

tutorialspoint.com报价,

注意,如果文件被打开使用是“a”或“A +”追加,任何寻求()操作将在下次写撤消。

“a”模式write操作追加到文件末尾。 seek所做的是将写入/读取指针设置为文件中的特定位置。

因此,当一个write被调用时,它将写入文件的结尾,而不管读/写指针如何。

但是,由于您打开了a+b中的文件,您将能够找到特定的位置和read它。

+0

是的确实它工作时,我打开文件使用“WB”,但我需要“AB”,因为我部分发送文件(在ODER处理大文件)有没有解决这个问题? –

+0

您可以先用'r'模式打开现有文件,并获取内容。之后,您可以使用'w'模式重新创建文件,并写入现有评论,并搜索并添加新内容。 – Dashadower

+0

@RS Halim但是要小心,如果您使用大型文件,则可能会遇到内存错误。 – Dashadower

1

如果使用'append'模式打开,则所有写入都将转到文件末尾。如果ypu已经在跟踪接收数据的位置,那么只需打开w+b模式即可。

wb创建(或清空)文件,并允许写入(以二进制而不是文本模式)。 w+b是否一样,但也允许阅读。如果要在不截断现有文件的情况下打开现有文件,模式r+b将允许读取和写入,同时保留现有数据(同样,b用于二进制模式,我认为这对于您的使用是正确的)。

+0

是模式“w + b”的作品与“wb”相同,因为我想更新文件,我不想失去旧的数据.. –