我在输入文件中保存了多个片段。格式为;
Use case 1:
host port start_byte end_byte
127.0.0.1 12345 0 2048
127.0.0.1 12346 0 1024
127.0.0.1 12347 1024 2048
Use case 2:
host port start_byte end_byte
127.0.0.1 12345 0 2048
127.0.0.1 12346 1024 2048
127.0.0.1 12347 0 1024
这里,第一行是供参考,以了解每一行的含义。 主机是本地主机,但端口不同。
这里有3个端口。端口#12345有整个文件(比如abc.txt)。港口#12347有 第二段,而#12346号港口有第一段。
现在,我想从文件末尾向文件开头读取文件(从第3行到第1行)。
下面给出了下载每个段并写入新文件的代码。
def downloadSegment(threadName, fileNameTemp, server_addr, server_port, segment_beginaddr, segment_endaddr, fileName, maxSegmentSize,ip_address,peer_server_port, relevant_path):
downloadSegmentStr = "download," + fileName + ","+segment_beginaddr+"," + segment_endaddr
socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket1.connect((server_addr, int(server_port)))
socket1.send(downloadSegmentStr)
lock.acquire()
with open(fileNameTemp, 'ab') as file_to_write:
file_to_write.seek(int(segment_beginaddr),0)
while True:
data = socket1.recv(maxSegmentSize)
#print data
if not data:
break
#print data
file_to_write.write(data)
file_to_write.close()
lock.release();
socket1.close()
当我按递增顺序编写段(用例1)时,它完美地工作。但是,当我尝试使用上面用例2中解释的out of order
时,它不起作用。
感谢任何帮助。感谢。
答案 0 :(得分:0)
您错过了Python文档的这些部分:
open(name[, mode[, buffering]])
...
'a'
用于追加(在某些Unix系统上意味着 all 无论当前的搜索是什么,写入追加到文件的末尾 位置)。...请注意,如果打开文件进行追加(模式
'a'
或'a+'
), 任何seek()
操作将在下一次写入时撤消。如果文件是 只有在附加模式(模式'a'
)中打开才能打开,此方法是 基本上是无操作...
因此,模式'a'
不适合该任务。遗憾的是,stdio
的{{1}}提供了没有fopen()
的模式,如果文件不存在则会创建文件,如果文件存在则不会截断文件。所以我会像使用a
一样使用:
os.open()