所以我有2个迷你剧本。 1产生我期望的输出,另一个不产生。生成我期望的输出的第一个代码:
with open('cities.txt', 'r') as cities, \
open('test_file.txt', 'r') as test:
space = " "
city_lst = []
test_lst = []
for c in cities:
city_lst.append(c)
for t in test:
test_lst.append(t)
for city in city_lst:
for tes in test_lst:
print city.rstrip(),space,tes.rstrip()
输出(如我所料):
san diego san diego is the best place
san diego Then there is new york state
san diego And now we have tuscon in arizona
san francisco san diego is the best place
san francisco Then there is new york state
san francisco And now we have tuscon in arizona
tuscon san diego is the best place
tuscon Then there is new york state
tuscon And now we have tuscon in arizona
pheonix san diego is the best place
pheonix Then there is new york state
pheonix And now we have tuscon in arizona
sedona san diego is the best place
sedona Then there is new york state
sedona And now we have tuscon in arizona
baton rouge san diego is the best place
baton rouge Then there is new york state
baton rouge And now we have tuscon in arizona
在下一段代码中,虽然我愿意,但我没有得到输出。它与上面的代码基本相同,只是我直接使用文本文件而不是先将它们转换为列表。然而,令我困惑的是为什么我没有得到完全相同的输出。
代码:
with open('cities.txt', 'r') as cities, \
open('test_file.txt', 'r') as test:
space = " "
for c in cities:
for t in test:
print c.rstrip(), space, t.rstrip()
输出:
san diego san diego is the best place
san diego Then there is new york state
san diego And now we have tuscon in arizona
由于我在每个代码中使用相同的double for循环,使用相同的print语句,为什么输出存在差异?
以下是文本文件的内容: cities.txt:
san diego
san francisco
tuscon
pheonix
sedona
baton rouge
test_file.txt:
san diego is the best place
Then there is new york state
And now we have tuscon in arizona
答案 0 :(得分:2)
因为文件是迭代器,列表就是列表。
当你这样做时
for t in test:
pass # do anything here
在该循环结束时,您已经完成了迭代器的操作。其中没有更多内容!亲自尝试一下!:
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")
你会注意到这里完全缺乏炼金术。
你可以做的是seek
回到文件的开头,然后每次都阅读。
for c in cities:
test.seek(0)
# place the pointer at the beginning of the file
for t in test:
frobnicate_stuff()
但是我喜欢一次阅读每个文件并在列表上操作,就像上面的例子中那样。你可以用itertools.product
:
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()))
<强> 修改 强>
事实上,进一步的测试表明itertools.product
在使用之前内化了每个迭代器!这意味着我们可以做到:
with open('cities.txt') as cities, \
open('tests.txt') as tests:
for c, t in itertools.product(cities, tests):
print(c.rstrip() + " " + t.rstrip())
答案 1 :(得分:1)
因为文件的对象是迭代器。要将其转换为列表,请使用.readlines()
函数。您的代码应该是:
with open('cities.txt') as cities, open('tests.txt') as tests:
for c in cities.readlines()
for t in tests.readlines():
print(c.rstrip() + " " + t.rstrip())
或者,您也可以使用itertools.product()
来防止嵌套循环。在这种情况下,您的代码应该是:
with open('cities.txt') as cities, open('tests.txt') as tests:
for c, t in itertools.product(cities.readlines(), tests.readlines()):
print("{city} {test}".format(city=c,test=t))
注意:而不是使用+
直接附加字符串。这是使用.format()
方法的更好方法。