python-2.7 - 嵌套循环读取文件
问题描述
我是 python 新手,我对嵌套循环的一些特定用法有点困惑。
例如,我有两个文件(file1和file2)。File1包含一些文本行:
line1
line2
并且file2还包含一些文本:
line1
line2
line3
line4
line5
我的脚本是:
with open('file1.txt', 'r') as file1:
with open('file2.txt', 'r') as file2:
for line in file1:
for line2 in file2:
print(line2),
所以我期望这样的输出:
line1
line2
line3
line4
line5
line1
line2
line3
line4
line5
但我的输出实际上是:
line1
line2
line3
line4
line5
有人能解释一下为什么只执行内部循环吗?我错过了什么吗?将文件内容存储到列表时没有问题。
解决方案
为什么只执行内部循环?
这种观察是错误的。两个循环都被执行了。
file
对象是生成器。它们只能被迭代一次然后它们被认为是消耗的(即空的)。
在外部循环的第一次迭代中,file2
尚未消耗,因此内部循环能够按预期执行。
从外循环的第二次迭代开始,file2
完全消耗(即为空),因此外循环没有要执行的内容,基本上相当于:
for line in file1:
for line2 in []:
print(line2)
要解决此问题,请使用.readlines
以列表形式获取文件的内容。
顺便说一句,您可以with
在一行上有多个语句,从而节省缩进级别。另外,'r'
是默认模式:
with open('file1.txt') as file1, open('file2.txt') as file2:
...
推荐阅读
- r - 如何将自由文本条目作为图例添加到 ggplot?
- ssis - 优先约束在SSIS中评估为真(或假)是什么意思
- python - 分解python中的列表理解
- mysql - mySQL 删除唯一键约束
- firebase - 如何以相反的顺序从 Firebase 数据库添加数据?
- d3.js - 将 y 轴水平线添加到 D3 散点图
- swift - 带有扩展部分的 Swift UITableView,在选定的新部分上强制关闭已打开的部分
- list - Swiftui 移除滑动删除功能
- android - 依次运行两个倒数计时器
- r - Creating a one variable when multiple answers are chosen -- in R