Python如何在文件中匹配含换行符的字符串?逐行匹配返回False如何解决
问题根因
你写的逐行遍历逻辑无法匹配跨换行的字符串:Python 逐行读取文件时,每次拿到的line变量仅包含单行内容,换行符作为行分隔边界不会跨越两个line变量,你的测试场景中y在第一行末尾、t在第二行开头,y\nt自然不可能出现在任意一个单行内容中,所以匹配失败。
另外原有代码还存在文件资源泄漏的问题:return语句执行后函数会直接退出,后续的file1.close()永远不会被运行,未关闭的文件句柄会一直占用系统资源。
修复方案
方案1:小文件全量读取(最简实现)
如果文件体积不大,直接一次性读取全部文件内容做匹配即可,自动支持跨换行的字符串匹配,同时用with上下文管理器自动处理文件关闭:
def ffindstring(fname, s): with open(fname, "r", encoding="utf-8") as f: full_content = f.read() return s in full_content
你的测试用例调用该函数会正确返回True。
方案2:大文件滑动窗口匹配(低内存占用)
如果文件体积过大不适合全量加载到内存,可以用滑动窗口的方式,每次保留上一行末尾的部分内容和当前行拼接后匹配,内存占用仅和待匹配字符串的长度挂钩:
def ffindstring(fname, s): s_len = len(s) if s_len == 0: return True # 保留上一行末尾最多s_len-1长度的内容,用于跨行匹配 prev_tail = "" with open(fname, "r", encoding="utf-8") as f: for line in f: check_content = prev_tail + line if s in check_content: return True # 更新待保留的末尾内容 prev_tail = line[-s_len+1:] if len(line) >= s_len -1 else line return False
内容的提问来源于stack exchange,提问作者Anand Sukumaran
相关产品推荐
相关产品推荐

