遍历文件行异常:脚本仅输出首个匹配项即终止迭代的技术求助
解决Python脚本遍历文件时提前终止的问题
你写的这个脚本本来是想找出所有没有对应[行内容] downloaded行的条目,但运行起来只输出第一个匹配项就停了对吧?比如你给出的测试文件里,应该只输出WhatsApp,但脚本可能只输出它之后就结束了,没法继续检查后面的内容。
问题出在哪?
问题出在你对文件对象的迭代方式上:当你用for line in f遍历文件时,文件指针会随着迭代逐步移动。而当你执行if not line.strip('\n') + " downloaded\n" in f这行代码时,Python会从当前文件指针的位置开始往后查找这个字符串,找完之后文件指针直接跳到了文件末尾。这时候后面的for line in f循环就没有剩余内容可以迭代了,自然就终止了。
修复方案
这里给你两种靠谱的解决办法:
方法1:先把整个文件内容读进内存
把文件内容一次性读取成字符串,这样后续的检查就不会影响迭代了:
with open('filename') as f: # 读取全部内容,同时处理换行符 file_content = f.read() # 按行分割,得到每一行的内容(不带末尾的换行符) for line in file_content.splitlines(): # 检查对应的downloaded行是否存在 if f"{line} downloaded" not in file_content: print(line)
方法2:先收集所有已下载的条目
先把所有带downloaded的条目提取出来,再和原条目对比:
with open('filename') as f: # 读取所有行,去掉末尾的换行符 all_lines = [line.rstrip('\n') for line in f] # 把带downloaded的条目去掉后缀,存进集合(查找更快) downloaded_items = {item.replace(' downloaded', '') for item in all_lines if ' downloaded' in item} # 遍历所有条目,找出不在已下载集合里的 for line in all_lines: if line not in downloaded_items: print(line)
这两种方法都能正常遍历整个文件,输出所有没有对应downloaded行的条目,比如你的测试文件里,只会输出WhatsApp,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Simol
相关产品推荐
相关产品推荐

