Python文件操作疑问:为何需重复使用open()函数读取文件?
Python文件操作中为何需要重复调用open()?
问题场景
你在Jupyter Notebook学习Python文件操作时遇到了这个情况:
运行初始代码时,第二个print没有任何输出:
my_file = open("test.txt") for line in my_file: print("Here it says: " + line) lines = my_file.readlines() print(lines[1])
但在调用readlines()前重新open文件后,第二个print就正常输出了:
my_file = open("test.txt") for line in my_file: print("Here it says: " + line) my_file = open("test.txt") lines = my_file.readlines() print(lines[1])
核心原因
这和文件对象的读取指针位置有关:
- 当你用
for line in my_file遍历文件时,读取指针会从文件开头一步步移动到文件末尾,遍历结束后,指针已经停在最后了。 - 这时候再调用
readlines(),指针后面没有内容可读,所以返回空列表,自然没法输出lines[1](甚至文件行数少的话还会直接报错)。 - 而重复调用
open("test.txt")会生成一个全新的文件对象,它的读取指针默认指向文件开头,所以readlines()能正常读取所有行内容。
不用重复open的替代方法
其实不用每次都重新打开文件,有两种更优的方式:
- 重置读取指针:用
seek(0)把指针移回文件开头
my_file = open("test.txt") for line in my_file: print("Here it says: " + line) my_file.seek(0) # 将指针重置到文件起始位置 lines = my_file.readlines() print(lines[1]) my_file.close() # 记得手动关闭文件
- 一次性读取所有内容(推荐):用
with语句管理文件,先把所有行读到列表里
with open("test.txt") as my_file: all_lines = my_file.readlines() # 先遍历输出 for line in all_lines: print("Here it says: " + line) # 后续直接访问列表里的内容 print(all_lines[1])
with语句会自动帮你关闭文件,既安全又不用处理指针问题,是Python操作文件的标准写法。
内容的提问来源于stack exchange,提问作者Vlungz
相关产品推荐
相关产品推荐

