原文:https://www.cnblogs.com/dancesir/p/7804989.html
考慮如下的案例:
同時打開三個文件,文件行數一樣,要求實現每個文件依次讀取一行,然后輸出,我們先來看比較容易想到的寫法:
with open(filename1, 'rb') as fp1: with open(filename2, 'rb') as fp2: with open(filename3, 'rb') as fp3: for i in fp1: j = fp2.readline() k = fp3.readline() print(i, j, k)
注意這里只能對單個文件進行for循環讀取,不能寫成:
for i, j, k in fp1, fp2, fp3: print(i, j, k)
但可使用強大的zip操作:
for i, j, k in zip(fp1, fp2, fp3): print(i, j, k)
這樣層層的嵌套未免啰嗦,with結構支持一種更簡潔的寫法:
with open(filename1, 'rb') as fp1, open(filename2, 'rb') as fp2, open(filename3, 'rb') as fp3: for i in fp1: j = fp2.readline() k = fp3.readline() print(i, j, k)
或者使用更為優雅的寫法,此時需要contextlib語法糖:
from contextlib improt ExitStack with ExitStack() as stack: files = [stack.enter_context(open(fname)) for fname in [filename1, filename2, filename3]] for i, j, k in zip(files[0], files[1], files[2]): print(i, j, k)