Python读取TXT文件后列表推导式返回空列表的问题排查
代码问题分析与解决
嘿,你这段代码确实有个容易忽略的小问题,导致返回了空列表,咱们拆解来看:
先看你写的代码:
base_txt = open(path, 'rU') txt = base_txt.readlines() txt = [x for x in base_txt if x.startswith('#')] print txt print len(txt)
核心问题出在文件指针的位置上:当你调用base_txt.readlines()的时候,已经把文件里的所有内容一次性读取出来了,这时候文件内部的指针会直接跳到文件末尾。之后你再去遍历base_txt这个文件对象时,已经没有任何内容可以读取了,所以列表推导式自然得到空列表。
另外还有两个小细节可以优化:
'rU'这个模式在Python 3里已经被弃用了,建议换成'r'模式加上newline=''来兼容不同平台的换行符- 尽量用
with语句打开文件,它会自动帮你关闭文件,避免忘记关闭导致的资源泄漏
给你两种修正后的写法:
写法一(推荐,更规范)
with open(path, 'r', newline='') as base_txt: # 直接遍历文件对象即可,无需先调用readlines() filtered_lines = [line for line in base_txt if line.startswith('#')] print(filtered_lines) print(len(filtered_lines))
写法二(保留你原有的读取逻辑)
如果你一定要先把所有内容读进列表,那可以基于已经读取的txt列表做推导:
base_txt = open(path, 'r') txt = base_txt.readlines() base_txt.close() # 手动关闭文件 filtered_lines = [x for x in txt if x.startswith('#')] print(filtered_lines) print(len(filtered_lines))
简单来说,就是文件对象只能被完整读取一次,你先把内容读完了,后面再读就没东西啦~
内容的提问来源于stack exchange,提问作者Yafim Simanovsky
相关产品推荐
相关产品推荐

