Strange behavior with iterables - is this a bug?
Gary Herron
gherron at islandtraining.com
Wed May 31 11:56:13 EDT 2006
akameswaran at gmail.com wrote:
>Gary Herron wrote:
>
>
>>List comprehension is a great shortcut, but when the shortcut starts
>>causing trouble, better to go with the old ways. You need to reopen each
>>file each time you want to iterate through it. You should be able to
>>understand the difference between these two bits of code.
>>
>>The first bit opens each file but uses (two of them) multiple times.
>>Reading from a file at EOF returns an empty sequence.
>>
>>The second bit opened the file each time you want to reuse it. That
>>works correctly.
>>
>>And that suggest the third bit of correctly working code which uses list
>>comprehension.
>>
>># Fails because files are opened once but reused
>>f1 = open('word1.txt')
>>f2 = open('word2.txt')
>>f3 = open('word3.txt')
>>for i1 in f1:
>> for i2 in f2:
>> for i3 in f3:
>> print (i1.strip(),i2.strip(),i3.strip())
>>
>>and
>>
>># Works because files are reopened for each reuse:
>>f1 = open('word1.txt')
>>for i1 in f1:
>>f2 = open('word2.txt')
>>for i2 in f2:
>>f3 = open('word3.txt')
>>for i3 in f3:
>>print (i1.strip(),i2.strip(),i3.strip())
>>
>>and
>>
>># Also works because files are reopened for each use:
>>print [(i1.strip(),i2.strip(),i3.strip())
>> for i1 in open('word1.txt')
>> for i2 in open('word2.txt')
>> for i3 in open('word3.txt')]
>>
>>Hope that's clear!
>>
>>Gary Herron
>>
>>
>
>
>My original problem was with recursion. I explicitly nested it out to
>try and understand the behavior - and foolishly looked in the wrong
>spot for the problem, namely that file is not reitreable. In truth I
>was never concerned about file objects, the problem was failing with my
>own custom iterators (wich also were not reiterable) and I switched to
>file, to eliminate possible code deficiencies on my own part. I was
>simply chasing down the wrong problem. As was pointed out to me in a
>nother thread - the cleanest implementation which would allow me to use
>one copy of the file (in my example the files are identical) would be
>to use a trivial iterator class that opens the file, uses tell to track
>position and seek to set position, and returns the appropriate line for
>that instance - thus eliminating unnecessary file opens and closes.
>
>
>
I see.
I wouldn't call "tell" and "seek" clean. Here's another suggestion. Use
l1 = open(...).readlines()
to read the whole file into a (nicely reiterable) list residing in
memory, and then iterate through the list as you wish. Only if your
files are MANY megabytes long would this be a problem with memory
consumption. (But if they were that big, you wouldn't be trying to find
all permutations would you!)
Gary Herron
More information about the Python-list
mailing list