在Python中覆盖文件

问题描述:

我想在Python中写一个文件,所以它只保留从串口读取的最新信息。我已经尝试了几种不同的方法,并阅读了很多不同的文章,但是文件不断重复写入信息而不覆盖之前的条目。在Python中覆盖文件

import serial 

ser=serial.Serial('/dev/ttyUSB0',57600) 

target=open('wxdata' , 'w+') 

with ser as port, target as outf: 
     while 1: 
      target.truncate() 
      outf.write(ser.read)) 
      outf.flush() 

我有一个气象站无线发送数据到树莓派,我只是希望该文件保持一行接收到的当前数据。现在它只是一直循环和添加。任何帮助将不胜感激..

+0

在循环中打开文件,如果你想覆盖每次或'file.seek(0)file.truncate(0)file.write' – 2014-11-21 23:03:50

+0

你也缺少'ser.read' serre上的parens .read()' – 2014-11-21 23:05:26

在您开始编写的文件,添加以下行:

outf.seek(0) 
outf.truncate() 

这将使它所以,无论你写未来将覆盖该文件

+0

小心这一般 - 如果你下一步写的比以前的文件短,只有文件的开头会被覆盖!对'truncate()'的调用也是必需的。 – Cameron 2014-11-21 23:00:05

+0

感谢您的提示! – 2014-11-22 00:51:02

通过默认,truncate()只会将文件截断为当前位置。在你的循环中,第一次通过时只有0。你的循环更改为:

while 1: 
    outf.seek(0) 
    outf.truncate() 
    outf.write(ser.read()) 
    outf.flush() 

注意truncate()不会接受一个可选的尺寸参数,它你可​​以为传递0,但你仍然需要写反正在下部分之前寻求回到开头。

+0

'outf.write(ser.read())' – 2014-11-21 23:06:52

+0

@Padraic:恩,谢谢。我复制粘贴没有读得太紧密;-) – Cameron 2014-11-21 23:09:29

+0

感谢您的意见,它是有意义的! – 2014-11-23 15:26:26

我会改变你的代码看起来像:

from serial import Serial 

with Serial('/dev/ttyUSB0',57600) as port: 
    while True: 
     with open('wxdata', 'w') as file: 
      file.write(port.read()) 

这将确保它被截断,刷新等为什么工作,你不就得了? :)