with open('a.file') as f1, open('b.file') as f2:
for pair in f1, f2:
print(pair)
报<io.TextIOWrapper name='a.file' mode='r' encoding='utf-8'>
<io.TextIOWrapper name='b.file' mode='r' encoding='utf-8'>
这是什么东西,我以为会每次循环交叉打印f1,f2每一行呢
with open('a.file') as f1:
for pair in f1:
print(pair)
那为什么写一个文件就不是元组了呢?(f1)不行吗
这段代码的输出是:
text
<io.TextIOWrapper name='a.file' mode='r' encoding='utf-8'>
<io.TextIOWrapper name='b.file' mode='r' encoding='utf-8'>
这是因为:
f1, f2 创建了一个包含两个文件对象的元组
循环遍历这个元组,每次迭代获取一个文件对象
print(pair) 打印文件对象本身,而不是文件内容
for pair in f1, f2:
,这里 f1, f2
创建了一个元组,然后循环迭代这个元组,所以会依次得到f1和f2两个文件对象。
但是,当你写 for pair in f1:
时,情况就不同了。这里,f1
是一个文件对象,而文件对象是可迭代的,迭代文件对象会逐行返回文件中的行。
所以,关键区别在于:
for pair in f1, f2:
中的 f1, f2
是一个元组,所以循环两次,第一次是f1,第二次是f2(两个文件对象)for pair in f1:
中的 f1
是一个文件对象,循环的是文件中的每一行for pair in f1: - 迭代文件对象本身(逐行)
for pair in (f1, f2): - 迭代包含文件对象的元组
for pair in f1, f2: - 这是上面第二种写法的简写,Python 会自动创建元组
主要原因是(1)不是元组是int类型,(1,)加个逗号才是元组
同样(f1)是文件对象类型(<class '_io.TextIOWrapper'>)
而(f1,)是元组
所以想要看看元组类型长啥样子,不想获取内容:
with open('a.file') as f1:
for pair in (f1,):
print(pair)
同样省略括号也可以:
with open('a.file') as f1:
for pair in f1,:
print(pair)
都会打印<io.TextIOWrapper name='a.txt' mode='r' encoding='utf-8'>