To readline() or readlines()

12 March 2004   27 comments   Python

Powered by Fusion×

When you create a file object in Python you can read from it in several different ways. Not until today did I understand the difference between readline() and readlines(). The answer is in the name. readline() reads one line character at a time, readlines() reads in the whole file at once and splits it by line.

These would then be equivalent:

f = open('somefile.txt','r')
for line in f.readlines():
    print line

# ...and...

f = open('somefile.txt','r')
for line in'\n'):
    print line

The xreadlines() function should be used for big files:

f = open('HUGE.log','r'):
for line in f.xreadlines():
   print line

From Charming Python

" The difference between .readline() and .readlines() is that the latter, like .read(), reads in an entire file at once. .readlines() automatically parses the read contents into a list of lines, thereby enabling the for ... in ... construct common in Python. Using .readline() reads in just a single line from a file at a time, and is generally much slower than .readlines(). Really the only reason to use the .readline() version is if you expect to read very large files that might exceed available memory."


Thanks commentors for pointing out that I and the Charmed Python book got it completely wrong. readline() reads one character at a time. xreadlines() reads one line at a time. I've changed the example code above.


Dan Atterton
Another useful way to read a file is the 'read()' function. I use it when I need a string to feed the function.

fileContent = open( fname,'r').read()
# since I didn't assign the file object to a variable, it's closed after read. fileContent )

theMD5 = md5Object.digest()

This is useful if you are trying to find duplicate files (notably pictures) by their md5 checksum.

Mikael Engdahl
You can't use the for ... in ... construct with readline() the same was as you can readlines(). It would read only one line and iterate it character by character.
Actually, the two are not quite the same. readlines() will return newlines on the end of your strings, while readline() will not.
Ludvig Ericson
>>> f.readline()
'\x1b[0;35m .vir. d$b\n'
>>> f.readlines()
['\x1b[0;35m .d$$$$$$b. .cd$$b. .d$$b. d$$$$$$$$$$$b .d$$b. .d$$b.\n', (cut) ]

Notice how both end in \n.
Code is wrong, too bad google gives it such a high page rank
Peter Bengtsson
sorry. updated now.
Nicholas Labello
Peter, thanks for providing/updating this page. The examples were very useful.
Ludvig Ericson

I think you desperately need to realize how Python works.
file.readline() - reads ONE line.
file.readlines() - reads ALL lines, and splits them by line delimiter.

Now, imagine:
f = file("/etc/motd", "r")
print f.readline()
Will that print the first line or first character of that file? The first line.
Consider this:
for line in f.readline():
print line
This will _of course_ print each charater, since **iterating str objects returns each character of them in a sequence!**
i seem to have a problem with readlines()as below, am i doing anything wrong?

i have

global f

f=open("hello.txt", "r")

f1 = open("C:\\log1.txt",'w')
f2 = open("C:\\log2.txt",'w')

def new1():
for line in f.readlines():
if line.find('raj')>= 0:
f1.write("%s" %line)

def new2():
for line in f.readlines():
if line.find('abc')>= 0:
f2.write("%s" %line)


i don't seem to get an output for new2 ,i mean it doesn't go through the for loop

Am i doing anything wrong ??
In new1 you read the file f to the end.
and when you come to new2
f is at end of file.
Thats why
Before new2()
f=open("hello.txt", "r")
cheers peter...

you keep popping up in my results...
In your code'\n') will return one more line comparing with the f.readlines().
However the last line is ""

So they are not equal :)
Oscar Lindberg
I just want to mention that what you probably want to do when reading a file line by line is this: (Taken from the File documentation of Python):

f = open("hello.txt")
..for line in f:
....print line

xreadlines() is deprecated since release 2.3. The "for line in f" pattern is recommended.
I'm stuck with file reading, just thought the users here might be able to point out how to go about what I want to do.

The basic loop is

f = open("hello.txt")
..for line in f:
....print line

as shown above.

However, in place of print line, I'm trying to search the current line for a particular string. I'm pretty new to Python, and I'm not sure how I do this. Can anyone here help me out with this? Thanks.
Peter Bengtsson
The short answer is::

if line.find('mystring') > -1:

The long answer is:
Thanks for the help Peter, sorry to bother you with such a trivial question as well.
You probably know the answer to my question. PEP 234 says that these are equivalent:

for line in iter(f.readline, ""):

for line in f:

But they are not. When reading from a named pipe, the first will work after a newline has been sent to the pipe and then the pipe has been flushed, while the latter only outputs after a large number of bytes have been put into the pipe. Why? Some kind of buffering with the internal next function?
Hi Im new to python.I have a data in the form of matrix(rows and columns) .I need to open the .dat file in python and want to access each elemnt or store all the elments in to single dimensional array . How can I do that in simple way.
thanx well appriciated
Hi Guys.

I am in need of major help right now. I am a new guy to python, programming and computer science, and the problem I face seems like a basic one, but what i need to know is how to write a programm that will access a file i have saved on my desktop, and that will return a random quotation that comes from that file.
I would really appreciate the help as soon as possible.
Hilarious how often I reference this page. You'd think I'd have it memorized by now. I literally use this page at least once a month.

Me = retarded, you = made something very useful.
Peter Nau
It is useful. However, if you reference it frequently, just think of it as external memory, not a bad thing at all...
yaah...really good link this is.
Byneni revathi
Yaah.... i get some more which i want,and i felt really happy to meet this cite.Thank you.
Your update doesn't make any sense. file.readline() does read a single line, not a character. *Iterating* on the line, of course, will iterate on characters.
deepak suresh
File "", line 538, in main
    rec_file =[0],"r","utf-8")
  File "/usr/lib/python2.6/", line 870, in open
    file =, mode, buffering)
IOError: [Errno 2] No such file or directory: 'dsauto1'

since i have file called dsauto1 in directory ...why these error???
 i have a doubt related to readline(). read line one after another and print specific characters within each line.
my question is kind of huge. which i have asked over here
it would be kind enough if you do take a look. thanks

Your email will never ever be published

Related posts

Python UnZipped 11 March 2004
The meaning of "hacking" 13 March 2004
Related by keywords:
bool is instance of int in Python 05 December 2008
Reciprocal lesson about gender perspectives 02 September 2011
Nginx vs. Squid 17 March 2009
IssueTrackerProduct now officially abandoned 30 March 2012
How and why to use django-mongokit (aka. Django to MongoDB) 08 March 2010
On the command line no one can hear you screen. Or can they? 03 May 2012
Nasty surprise of Django cache 09 December 2008
Random ID generator for Zope 02 September 2005
Google Calendar, iCalendar Validator but not bloody Apple iCal 09 April 2009
tempfile in Python standard library 07 February 2006
In Django, how much faster is it to aggregate? 27 October 2010
Google and Python code 22 February 2006