<p>因为文件是迭代器,而列表是列表</p>
<p>当你这么做的时候</p>
<pre><code>for t in test:
pass # do anything here
</code></pre>
<p>循环结束时,您已经耗尽了迭代器。里面什么都没有了!你自己试试!:</p>
<pre><code>with open('testfile.txt') as inf:
for line in inf:
print("There's a line here, I'm reading!")
for line in inf:
print("Turn lead into gold")
</code></pre>
<p>你会注意到这里完全没有炼金术</p>
<p>您可以做的是在每次读取文件之前<code>seek</code>返回到文件的开头</p>
<pre><code>for c in cities:
test.seek(0)
# place the pointer at the beginning of the file
for t in test:
frobnicate_stuff()
</code></pre>
<p>不过,我更喜欢一次读取每个文件并对列表进行操作,就像您在上面的示例中所做的那样。使用<a href="https://docs.python.org/2/library/itertools.html#itertools.product" rel="nofollow">^{<cd2>}</a>可能会做得更好:</p>
<pre><code>import itertools
with open('cities.txt') as cities, \
open('test.txt') as test:
city_lst = cities.readlines()
test_lst = test.readlines()
for c, t in itertools.product(city_lst, test_lst):
print(c.rstrip() + " " + t.rstrip())
# or using string formatting:
# # print("{} {}".format(c.rstrip(), t.rstrip()))
</code></pre>
<p>编辑</p>
<p>事实上,进一步的测试表明<a href="https://docs.python.org/2/library/itertools.html#itertools.product" rel="nofollow">^{<cd2>}</a>在使用每个迭代器之前将其内部化!这意味着我们可以:</p>
<pre><code>with open('cities.txt') as cities, \
open('tests.txt') as tests:
for c, t in itertools.product(cities, tests):
print(c.rstrip() + " " + t.rstrip())
</code></pre>