我将堆栈生成器表达式:with open(filename) as f_in:
lines = (line.rstrip() for line in f_in) # All lines including the blank ones
lines = (line for line in lines if line) # Non-blank lines
现在,lines都是非空行。这样你就不用在电话线上打两次电话了。如果您想要一个行列表,那么您可以执行以下操作:with open(filename) as f_in:
lines = (line.rstrip() for line in f_in)
lines = list(line for line in lines if line) # Non-blank lines in a list
你也可以用一行代码(不包括with语句)来完成,但它没有效率更高,也更难阅读:with open(filename) as f_in:
lines = list(line for line in (l.strip() for l in f_in) if line)
更新:
我同意这是丑陋的,因为重复的令牌。如果你愿意,你可以写一个生成器:def nonblank_lines(f):
for l in f:
line = l.rstrip()
if line:
yield line
那就叫它:with open(filename) as f_in:
for line in nonblank_lines(f_in):
# Stuff
更新2:with open(filename) as f_in:
lines = filter(None, (line.rstrip() for line in f_in))
在CPython上(使用确定性引用计数)lines = filter(None, (line.rstrip() for line in open(filename)))
在Python 2中,如果需要生成器,请使用itertools.ifilter;在Python 3中,如果需要列表,请将整个过程传递给list。