乱序编写文件python

时间:2015-11-29 01:59:01

标签: file python-2.7 sockets

我在输入文件中保存了多个片段。格式为;

  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时,它不起作用。

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

您错过了Python文档的这些部分:

  

open(name[, mode[, buffering]])

     

... 'a'用于追加(在某些Unix系统上意味着 all   无论当前的搜索是什么,写入追加到文件的末尾   位置)。

     

file.seek(offset[, whence])

     

...请注意,如果打开文件进行追加(模式'a''a+'),   任何seek()操作将在下一次写入时撤消。如果文件是   只有在附加模式(模式'a')中打开才能打开,此方法是   基本上是无操作...

因此,模式'a'不适合该任务。遗憾的是,stdio的{​​{1}}提供了没有fopen()的模式,如果文件不存在则会创建文件,如果文件存在则不会截断文件。所以我会像使用a一样使用:

os.open()