python读取文件,文件f本身和f.readlines()是可迭代对象,但是与常见的变量不同,f和f.readlines()在读取遍历一次之后,其内容就空了,而变量则不会。以下为相关演示:
test1 = open("test1","r")
test2 = open("test2","r")
# test1.readlines() 和 test2.readlines()类型为列表,首先打印:
print(test1.readlines())
print(test2.readlines())
结果为:
['a a a a 55 a \n', 'b b b b 555 b\n']
['1 1 1 1 555 1\n', '2 2 2 2 55 2\n']
# 再次打印
print(test1.readlines())
print(test2.readlines())
结果为:
[]
[]
再次打印时就变成了两个空列表,说明f.readlines()与普通的list变量不同,读取一部分内容,这部分内容在f.readlines()没有了,读取完所有内容,f.readlines()就变成了空列表
# 关闭文件
test1.close()
test2.close()
再次测试可迭代f:
test1 = open("test1","r")
test2 = open("test2","r")
print(test1)
结果为:
<_io.TextIOWrapper name='test1' mode='r' encoding='UTF-8'>
由于test1 和 test2 的类型为 _io.TestIOWrapper, 我们无法直接看到其中的内容,可以通过以下for循环来证明
# 执行第一次for循环
for i in test1:
print(i, end="")
for z in test2:
print(z, end="")
结果为:
a a a a 55 a
b b b b 555 b
1 1 1 1 555 1
2 2 2 2 55 2
# 再次执行
for i in test1:
print(i, end="")
for z in test2:
print(z, end="")
执行结果为空,表明f在读取遍历之后内容也为空
# 关闭文件
test1.close()
test2.close()
为什么要注意这个坑呢?当你执行双for循环的时候就知道了,如下:
test1 = open("test1","r")
test2 = open("test2","r")
for i in test1.readlines():
for z in test2.readlines():
print(z,end="")
test1.close()
test2.close()
结果为:
1 1 1 1 555 1
2 2 2 2 55 2
乍一看好像没有问题,但是这里有两个for循环,理论上输出应该是2*2=4条结果,如下:
1 1 1 1 555 1
2 2 2 2 55 2
1 1 1 1 555 1
2 2 2 2 55 2
但是,由于第二个for运行完第一次之后,test2内容就读取完了(空),因此第二个for循环实际只运行了一次
解决办法: 第二个for循环重新赋值变量
test1 = open("test1","r")
test2 = open("test2","r")
test2_new = test2.readlines() ##### 注意此处将test.readlines 重新赋值到test2_new变量中,将test2赋值给test2_new没有用
for i in test1.readlines():
for z in test2_new:
print(z,end="")
test1.close()
test2.close()
结果为:
1 1 1 1 555 1
2 2 2 2 55 2
1 1 1 1 555 1
2 2 2 2 55 2