【发布时间】:2017-07-03 13:07:20
【问题描述】:
我有 30 个文本文件,每个文件 30 行。 出于某种原因,我需要编写一个脚本来打开文件 1,打印文件 1 的第 1 行,关闭它,打开文件 2,打印文件 2 的第 2 行,关闭它,等等。我试过这个:
import glob
files = glob.glob('/Users/path/to/*/files.txt')
for file in files:
i = 0
while i < 30:
with open(file,'r') as f:
for index, line in enumerate(f):
if index == i:
print(line)
i += 1
f.close()
continue
显然,我收到以下错误:
ValueError: 对已关闭文件的 I/O 操作。
因为 f.close() 的事情。仅读取所需行后,如何从文件移动到下一个文件?
【问题讨论】:
-
可以使用
break退出循环;用那个替换f.close()。底部的continue也是不必要的,外部循环可以是for i in range(0, 30):(或i, file in enumerate(files)?)而不显式增加i。 -
注意@Ryan 的跟进:
f.close()根本不需要,因为您在opening 文件时(正确地)使用了with语句,确保它自动关闭当你退出区块时。 -
旁注:您可以使用
itertools.islice完全删除显式内部循环。用print(next(itertools.islice(f, i, None)))替换with块的全部内容,无需任何类型的显式循环。这需要@Ryan 建议将外部while循环替换为for i, file in enumerate(files):(或确保您只处理30 个文件,for i, file in enumerate(islice(files, 30)):),这样您就不会手动跟踪/递增i。
标签: python python-3.x enumerate readlines