[Tutor] Uniform 'for' behavior for strings and files

Alan Gauld alan.gauld at btinternet.com
Tue Jun 10 02:14:27 CEST 2008


"Shrutarshi Basu" <technorapture at gmail.com> wrote

> for item in block:
>
> where block is a file, then item becomes each line of the file in 
> turn
> But if block in a large string (let's say the actual text that was 
> in
> the file), item becomes each character at a time.

Correct because for iterates over a sequence. It will return whatever
the unit of sequence is. So the challenge is to make the sequence
represent the data in the units you need.

So to make a long string return lines rather than characters you
need to break the string into lines. The easiest way to do that is
using the split() method:

for line in block.read().split():

But of course for files you can just read the lines directly - or
indirectly using readlines().

> have a uniform iteration irrespective of whether block is a file or
> string (ideally one \n-delimited line at a time)?

The for loop is uniform, it is just that the sequence unit is 
different

> default for behavior is being problematic. I could turn the whole 
> file
> into a string first, but that might cause problems with large files.

You could write a generator function that returned blocks. That
would fit your problem quite well and be memory friendly as well.
That way the for would work exactly as you require.

-- 
Alan Gauld
Author of the Learn to Program web site
http://www.freenetpages.co.uk/hp/alan.gauld 




More information about the Tutor mailing list