Python文本解析空行过滤异常:len()判断为何未生效?
嗨,我来帮你理清这个问题的原因,同时给你几个实用的解决办法:
问题根源
你当前代码里的if len(row)判断并不靠谱——文本文件里的“空白行”其实不是空字符串!比如换行符\n(Windows系统下是\r\n)本身是有长度的,len("\n")等于1,所以这个条件会被判定为True,进而执行row.split()。而当字符串全是空白字符时,split()默认会把所有空白都分割掉,最终返回一个空列表,这就是你看到srclines里混入空列表的原因。
解决办法
这里有几种简单的调整方式,都能帮你过滤掉这类无效的空列表:
办法一:先去除首尾空白再判断
先把行里的换行、空格、制表符等空白字符去掉,再判断处理后的内容是否非空:
srclines = [] with open(path, "r") as infile: for row in infile: # 去除首尾所有空白字符 cleaned_row = row.strip() if cleaned_row: # 只有处理后非空才继续 srclines.append(cleaned_row.split())
办法二:直接判断拆分后的列表是否非空
既然你最终要的是拆分后的列表,不如直接判断这个列表有没有内容:
srclines = [] with open(path, "r") as infile: for row in infile: parts = row.split() if parts: # 空列表在布尔判断中会被视为False srclines.append(parts)
这个写法更直接,因为row.split()在遇到全空白行时会返回空列表,if parts会自动跳过这类情况。
办法三:用列表推导式简化代码
如果想让代码更简洁,可以用一行列表推导式完成整个逻辑:
with open(path, "r") as infile: srclines = [row.split() for row in infile if row.strip()]
或者直接判断拆分后的结果:
with open(path, "r") as infile: srclines = [row.split() for row in infile if row.split()]
补充说明
你提到“打印阶段添加len()判断能正确过滤空列表”,这是因为打印时你判断的是拆分后列表的长度(len(列表)),而生成srclines时你判断的是原行字符串的长度(len(row)),这两个判断的对象完全不同,所以结果自然不一样啦。
内容的提问来源于stack exchange,提问作者James Lewis
相关产品推荐
相关产品推荐

