#从data.txt(Excel文件)中找出一些不在target.txt(TXT文件)文件行中出现的行。
#定义一个函数,判断ls中的每个单词是否出现在了mystring中了。如果全部都在,返回真
def listContain(ls, mystring):
for s in ls: #取出ls中的每个单词
if s not in mystring:
return False #如果ls中只要有一个单词不在mystring行,返回错误,函数运行结束
#如果s在mystring里面,继续进行下一轮for循环,也就是测试下一个单词是否存在mystring中,确认所有单词都出现在mystring里,返回true
#else:
#return True #return语句用来从一个函数 返回 即跳出函数。我们也可选从函数 返回一个值
return True #如果ls中每个单词都出现在了mystring中,相当于for循环没有执行,该函数返回真
#return 这里不能修改下吗?逻辑如何运转的。如果返回了一个False,后面的return就不用运行了吗?
#return运转如下:如果ls中有个单词都没有出现在mystring中,就返回错误,程序就结束了(不会执行最后返回真的语句),
#如果ls一个单词出现在mystring句子中,继续通过for循环判断下一个单词是否出现在mystring中,如果所有单词都出现在mystring中,
#,for循环执行完毕,程序返回True
file1 = 'data.txt'
file2 = 'target.txt'
file_output = 'results.txt' #output file name
file_output_less = 'results_less.txt'
lines1 = open(file1).readlines()
lines2 = open(file2).readlines()
if lines1 and lines2:
for line1 in lines1:
l1 = line1.replace('"', '').split() #删除每行的引号,然后切片变成列表
for line2 in lines2: #对列表中的每个元素进行处理,对目标文档进行每行搜索,看看l1是否存在其中的任何一行中
if listContain(l1, line2):#如果为真,也就是l1中所有单词都出现在line2里了,然后退出if,for循环,进入for循环,调出下一个l1句子
#问题1:如果为假,就应该输出该line1行到文件,不用犹豫;如果为假,程序如何进行
break #问题4:这种情况什么都不做,退出循环,程序去了哪里?退出if循环还是for循环
#Python break语句,就像在C语言中,打破了最小封闭for或while循环.如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码
#else:
#open(file_output, 'a').write(line1) #这样写会导致同一个line1对多个line2进行判断,我们只要判断line1没有出现,
#就输出line1,然后直接判断下一个line1,而不是看同一个line1是否出现在lines2的其他行,导致同一个line1重复多次输出
else: #问题2:else是对应哪个if,删除前面的if后,对结果没有影响啊,删除else,报缩进错误
open(file_output,'a').write(line1) #if为假,说明l1中有一个单词没有出现在line2中,就把该行写进文件里
#当l1通过for循环对lines2的每一场进行确定,l1确实不在lines2里面,自动会运行到else语句,这个else和for line2配套的,和C语法有点区别
#写入文件后,应该进行下一个line1的判断了,不用判断lines2里面的东西
#说明以前对行进行的各种处理都是临时的
#break #问题5:我添加break让程序自动跳到下一行line1为啥不行?程序提示open缩进有问题
lines3 = open(file_output).readlines()
for line3 in lines3:
if 'n.a.' not in line3:
open(file_output_less,'a').write(line3)
##############################################分割线#################################################
'''
for line1 in lines1: #逐行取出lines1内容
l1 = line1.replace('"', '').split() #对line1进行切片处理
for line2 in lines2:
if listContain(l1, line2): #如果line1包含在task文件的某一行,立刻退出,判断下一行line1
break
else: #如果line1不在lines2的所有行里,就执行else语句,把该line1语句添加进文件里
open(file_output,'a').write(line1)
关键代码分析:
'''
################################################分割线####################
'''
else的描述,
不只是if有,while和for都有else分支。循环体的else分支触发条件是循环正常结束。如果循环内被break跳出,就不执行break后紧跟的else。
所以这个逻辑是:如果循环内break了,
不触发else,则执行下一句外层循环中的break;如果正常结束,执行else分支里的continue,直接跳转到外层循环的下一轮,跳过了第二个break。
for和while的else子句用于循环后处理,仅在循环正常结束时执行。
问题中所举的例子,设置一个flag变量,代码看起来会更直观一些。
难说哪种写法好,我倒挺喜欢用else分支的。
作者:Coldwings
链接:https://www.zhihu.com/question/37076998/answer/70307714
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
for … else结构下
1.for里面的语句和普通的(没有else的for语句)没有区别;
2.else中的语句会在循环正常执行完后执行;
3.当for中语句通过break跳出而中断时,不会执行else。
最后总结一句,for ... else结构一般要和break一起使用,才能体现这个结构的强大之处(至少我是这么觉得的,不知还有什么其他情况,希望网友不吝赐教)。
while ... else结构也符合上述条件。
'''
https://www.zhihu.com/question/37076998/answer/70307714
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
for … else结构下
1.for里面的语句和普通的(没有else的for语句)没有区别;
2.else中的语句会在循环正常执行完后执行;
3.当for中语句通过break跳出而中断时,不会执行else。
最后总结一句,for ... else结构一般要和break一起使用,才能体现这个结构的强大之处(至少我是这么觉得的,不知还有什么其他情况,希望网友不吝赐教)。
while ... else结构也符合上述条件。
'''