Python遍历文件行失败及readlines返回空列表问题排查与解决
为什么Python读取文件后遍历无反应、后续readlines()返回空列表?
先看你的场景:
你有个topology_list.txt文件,执行cat topology_list.txt后内容如下:
First-Topology Third-topology Second-Topology
然后你写了这段Python代码:
file = open('topology_list.txt','r') print file.readlines() for i in file.readlines(): print "Entered For\n" print i topology_list = file.readlines() print topology_list
结果第一次readlines()能输出所有行的列表,但for循环完全没执行,最后topology_list是空的——这其实是个很常见的新手坑,问题出在文件指针的移动上。
问题根源
当你打开一个文件后,系统会维护一个"读取指针",记录当前读到了文件的哪个位置。第一次调用file.readlines()时,指针会从文件开头一直移动到末尾,把所有内容都读出来。这时候再调用file.readlines(),指针已经在文件末尾了,自然读不到任何内容,所以for循环没执行,最后赋值的列表也是空的。
几种正确的解决方式
1. 先把所有内容存到变量里(简单直接)
一次性把文件内容读取到一个变量中,之后所有操作都基于这个变量,就不会受指针位置的影响了:
file = open('topology_list.txt','r') # 把所有行存到变量里 all_topologies = file.readlines() print(all_topologies) # 遍历变量里的内容 for line in all_topologies: print("Entered For\n") # 用strip()去掉换行符,输出更整洁 print(line.strip()) # 最后别忘了关闭文件 file.close()
2. 直接遍历文件对象(更推荐,省内存)
Python的文件对象本身就是可迭代的,直接遍历它就行——这种方式不需要一次性把所有行加载到内存,尤其适合大文件,而且也不会有指针问题。另外强烈推荐用with语句,它会自动帮你关闭文件,避免资源泄漏:
with open('topology_list.txt','r') as file: # 如果需要先看所有内容,可以转成列表 print(list(file)) # 注意:转成列表后指针到末尾了,要重置回去才能遍历 file.seek(0) for line in file: print("Entered For\n") print(line.strip()) # 或者不需要先打印列表的话,直接遍历更简洁: # with open('topology_list.txt','r') as file: # for line in file: # print("Entered For\n") # print(line.strip())
3. 手动重置指针(不推荐,但可以了解)
如果你一定要多次读取文件,可以用file.seek(0)把指针移回文件开头,但这种方式不如前两种优雅:
file = open('topology_list.txt','r') print(file.readlines()) # 把指针移回文件开头 file.seek(0) for i in file.readlines(): print("Entered For\n") print(i.strip()) # 再次重置指针 file.seek(0) topology_list = file.readlines() print(topology_list) file.close()
小提醒
日常写代码时,尽量用with语句来管理文件,它会在代码块结束后自动关闭文件,比手动调用close()更安全,也更省心。
内容的提问来源于stack exchange,提问作者Gaurav Parashar
相关产品推荐
相关产品推荐

