从Excel文件中找出在TXT文件中没有出现的 行之_代码片段

来源:互联网 发布:淘宝卖家怎么开直通车 编辑:程序博客网 时间:2024/05/21 08:42


#从data.txt(Excel文件)中找出一些不在target.txt(TXT文件)文件行中出现的行。
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循环执行完毕,程序返回Truefile1 = 'data.txt'file2 = 'target.txt'file_output = 'results.txt'       #output file namefile_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结构也符合上述条件。'''

阅读全文
0 0
原创粉丝点击