Python中open()与文件句柄问题:重复遍历文件内容失败的原因及解决
嘿,这个问题我刚入门Python的时候也踩过一模一样的坑!让我给你讲明白咋回事,还有解决办法~
为啥第二次遍历文件啥都读不到?
你用open()拿到的fh是个文件迭代器,它就像一个只能往前挪的小指针。第一次for line in fh循环的时候,这个指针从文件开头一路跑到了结尾,把所有内容都读完了。等你第二次再循环的时候,指针已经停在文件末尾了,后面没东西可读,自然就输出空啦。
怎么把文件存进内存反复用?
给你几个实用的办法,按需选就行:
1. 把所有行存到列表里
一次性把文件的每一行都装进列表,之后想遍历多少次就多少次,还能随时按索引取某一行:
# 推荐用with语句,自动关文件,省得忘 with open('C:/Python/romeo.txt') as fh: lines = list(fh) # 把文件对象转成列表,每个元素是一行 # 第一次遍历 for line in lines: print(line.rstrip()) # 第二次遍历,照样有内容 for line in lines: print(line)
也可以直接用fh.readlines(),效果完全一样:
with open('C:/Python/romeo.txt') as fh: lines = fh.readlines()
2. 读取整个文件到字符串
如果不需要按行处理,直接把整个文件内容读成一个大字符串,想怎么操作都行:
with open('C:/Python/romeo.txt') as fh: full_content = fh.read() # 直接打印全部内容 print(full_content) # 要是想按行处理,分割一下就行 lines = full_content.splitlines() for line in lines: print(line)
3. 手动重置文件指针
要是不想把内容存内存,也可以把指针移回文件开头,用seek(0)方法:
fh = open('C:/Python/romeo.txt') # 第一次遍历 for line in fh: print(line.rstrip()) # 把指针拉回开头 fh.seek(0) # 第二次遍历就又能读到内容了 for line in fh: print(line) fh.close() # 记得手动关文件!
不过这个方法要注意,文本模式下可能因为换行符的编码问题出小问题,而且一直开着文件容易忘关,不如前两种方法省心。
内容的提问来源于stack exchange,提问作者mrmmickle1
相关产品推荐
相关产品推荐

