I was trying to read a changing file in Python, where a script can process newly appended lines. I have the script below which prints out the lines in a file and does not terminate.
with open('tmp.txt','r') as f:
while True:
for line in f:
print(line.replace('\n',''))
Where 'tmp.txt' consists of some lines, e.g.:
a
d
2
3
If I appended to the 'tmp.txt' file, such as using:
echo "hi" >> tmp.txt
The script will print out the new line in if the script is run with Python 3, but not with Python 2. Is there an equivalent in Python 2? And what's different between the two versions of Python in this case?
Looking at the objects f
in python 2.7 vs 3.5 they are slightly different
The following
with open('tmp.txt','r') as f:
print(f)
print(type(f))
In python 2.7 returns
<open file 'tmp.txt', mode 'r' at 0x0000000003DD9780>
<type 'file'>
Whereas in python 3.5 returns
<_io.TextIOWrapper name='tmp.txt' mode='r' encoding='cp1252'>
<class '_io.TextIOWrapper'>
The same behavior can be obtained in python 2.7 using
import io
with io.open('tmp.txt','r') as f:
while True:
for line in f:
print(line.replace('\n',''))
This should do the trick.
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)
Found original here: Reading from a frequently updated file
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With