2014-11-21 21 views
6

Próbuję nadpisać plik w pythonie, aby zachować tylko najbardziej aktualną informację odczytaną z portu szeregowego. Wypróbowałem kilka różnych metod i przeczytałem kilka różnych postów, ale plik ciągle zapisuje informacje bez przepisywania poprzedniego wpisu.Zastępowanie pliku w pythonie

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() 

Mam stację pogodową przesyłającą dane bezprzewodowo do raspberry pi, po prostu chcę, aby plik zachował jedną linię bieżących danych. teraz po prostu ciągle się zapętla i dodaje w kółko. Każda pomoc będzie mile widziana ..

+0

otwórz plik w pętli, jeśli chcesz go nadpisać za każdym razem lub 'file.seek (0) file.truncate (0) file.write' –

+0

Brakuje ci również parens na' ser.read' 'ser .read() ' –

Odpowiedz

0

Przed rozpoczęciem zapisu pliku, dodaj następujący wiersz:

outf.seek(0) 
outf.truncate() 

uczyni to tak, że cokolwiek napiszesz następny nadpisuje plik

+0

Ostrożnie z tym ogólnie - jeśli to, co napiszesz dalej, będzie krótsze niż to, co było wcześniej, tylko początek pliku zostanie nadpisany! Konieczne jest również wywołanie funkcji 'truncate()'. – Cameron

+0

Dzięki za napiwek! –

1

By domyślnie truncate() tylko obcina plik do aktualnej pozycji. Który z twoją pętlą za pierwszym razem wynosi 0. Zmień swoją pętlę:

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

Zauważ, że truncate() bierze opcjonalny argument rozmiar, który można przejść do 0, ale że nadal trzeba dążyć do początku przed napisaniem kolejnej części tak.

+0

'outf.write (ser.read())' –

+0

@Padraic: Hmm, tak, dzięki. Kopiuję wklejone bez zbytniego czytania ;-) – Cameron

+0

dzięki za radę to ma sens !!! –

3

chciałbym zmienić swój kod wyglądać:

from serial import Serial 

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

Pozwoli to upewnić się, że zostanie obcięty, zaczerwieniona, itd. Dlaczego pracować nie muszą? :)