Python3使用zip_longest时for循环未自动插入换行符问题问询
问题产生原因
- 文本文件的非末尾行被
open()函数读取时,末尾会自带\n换行符。你测试用的模板文件第一行First line实际读取结果为First line\n,目标文件第一行First lineXX实际读取结果为First lineXX\n。 - 你的比对逻辑存在疏漏:当
char1 == None(模板行已遍历结束)时,直接将对应位置的目标字符替换为全块符号,没有做例外判断。在目标首行比模板首行长2个字符的场景下,目标首行最后两个字符分别是多余的X和原本的\n,两个位置都会命中char1 == None分支,原本的换行符被直接替换为了全块符号,因此不会触发换行,下一行内容会直接接在当前行末尾输出。 - 文件内容完全一致时不会出现该问题,是因为所有行的
\n都会命中char1 == char2分支被正常输出,换行逻辑不受影响。
修复方案参考
仅需调整char1 == None分支的逻辑,保留目标行自带的换行符即可,同时建议增加文件自动关闭、行级补全逻辑避免异常:
from itertools import zip_longest def compare(filename1, filename2): # with语句自动管理文件句柄,避免资源泄漏 with open(filename1, "r") as file1, open(filename2, "r") as file2: # 行级也设置填充值,避免某一文件读完后遍历报错 for line1, line2 in zip_longest(file1, file2, fillvalue=''): for char1, char2 in zip_longest(line1, line2, fillvalue=None): if char1 == char2: print(char2, end='') elif char1 == None: # 保留换行符,其余差异位置输出全块高亮 print(char2 if char2 == '\n' else '\u2588', end='') compare('template.txt', 'target.txt')
内容的提问来源于stack exchange,提问作者dekkard
相关产品推荐
相关产品推荐

