2016-11-01 5 views
6

Ich habe versucht, eine sich ändernde Datei in Python zu lesen, wo ein Skript neu angefügte Zeilen verarbeiten kann. Ich habe das Skript darunter, das die Zeilen in einer Datei ausgibt und nicht beendet.Lesen ändernde Datei in Python 3 und Python 2

with open('tmp.txt','r') as f: 
    while True: 
     for line in f: 
      print(line.replace('\n','')) 

Wo tmp.txt 'einige Linien besteht, zum Beispiel:

a 
d 
2 
3 

Wenn ich auf die 'tmp.txt' Datei angehängt, wie die Verwendung von:

echo "hi" >> tmp.txt 

Das Skript druckt die neue Zeile aus, wenn das Skript mit Python 3, nicht aber mit Python 2 ausgeführt wird. Gibt es in Python 2 ein Äquivalent? Und was unterscheidet die beiden Versionen von Python in diesem Fall?

Antwort

5

an den Objekten f in Python Suche 2.7 vs 3.5 sind sie

Folgende

with open('tmp.txt','r') as f: 
    print(f) 
    print(type(f)) 

In Python 2.7 kehrt

<open file 'tmp.txt', mode 'r' at 0x0000000003DD9780> 
<type 'file'> 

Während in Python 3.5 kehrt etwas anders

<_io.TextIOWrapper name='tmp.txt' mode='r' encoding='cp1252'> 
<class '_io.TextIOWrapper'> 

Das gleiche Verhalten kann 2.7 mit

import io 

with io.open('tmp.txt','r') as f: 
    while True: 
     for line in f: 
      print(line.replace('\n','')) 
1

Dies sollte den Trick in Python erhalten werden.

import time 

def follow(file): 
    thefile.seek(0,2) 
    while True: 
     line = thefile.readline() 
     if not line: 
      time.sleep(0.1) 
      continue 
     yield line 

if __name__ == '__main__': 
    logfile = open("log.txt","r") 
    loglines = follow(logfile) 
    for line in loglines: 
     print(line) 

gefunden Original hier: Reading from a frequently updated file

+0

Der springende Punkt ist, dass durch meine Art und Weise asynchron es zu einem bestimmten Timer. Wenn Sie einen Server oder etwas betreiben, wäre das ein ziemliches Problem –