简体   繁体   中英

Unable to read multiline files in python using readline()

The following code is not working properly. It is unable to read multiline files in python using readline().

myobject=open("myfile.txt",'r')
while ((myobject.readline())):
    print(myobject.readline())
myobject.close()

It just prints the first line and then newlines. I don't understand why?

When you open the file in 'r' mode, the file object returned points at the beginning of the file.

Everytime you call readline, a line is read, and the object now points to the next line in the file

Since your loop condition also reads the file and moves it to the next line, you are getting lines only at even places, like line no 2, 4, 6. Line Numbers, 1, 3, 5, ... will be read by while ((myobject.readline())): and discarded.

A simple solution will be

myobject = open("myfile.txt",'r')
for line in myobject:
    print(line, end='')
myobject.close()

OR for your case, when you want to use only readline()

myobject = open("myfile.txt",'r')

while True:
    x = myobject.readline()
    if len(x) == 0:
        break
    print(x, end='')

myobject.close()

This code works, because readline behaves in the following way.

According to python documentation, https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects

f.readline() reads a single line from the file; a newline character (\\n) is left at the end of the string, and is only omitted on the last line of the file if the file doesn't end in a newline. This makes the return value unambiguous; if f.readline() returns an empty string, the end of the file has been reached, while a blank line is represented by '\\n', a string containing only a single newline.

It's because readline reads one line at a time, your code will still print a new line because readline keeps trailing newlines.

The way to fix would be to do this:

with open("myfile.txt", 'r') as f:
    for line in f:
        print(line)

readline() returns the line that it is currently pointing to and moves to the next line. So, the calls to the function in the while condition and in the print statement are not the same. In fact, they are pointing to adjacent lines.

First, store the line in a temporary variable, then check and print.

myobject = open('myfile.txt')
while True:
    line = myobject.readline()
    if line:
        print(line)
    else:
        break

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM