当有'其他'时,为什么re不编译'if'?

时间:2013-08-22 10:04:11

标签: python if-statement

你好,我遇到了问题,我不知道如何修复它。我所知道的是,当我将 else 语句添加到我的 if 语句时,python执行总是转到 else 语句,即使有一个 if 中的true语句,可以输入 if 语句。

这是脚本,没有else语句:

import re
f = open('C:\Users\Ziad\Desktop\Combination\MikrofullCombMaj.txt', 'r')
d = open('C:\Users\Ziad\Desktop\Combination\WhatsappResult.txt', 'r')
w = open('C:\Users\Ziad\Desktop\Combination\combination.txt','w')
s=""
av =0
b=""
filtred=[]
Mlines=f.readlines()
Wlines=d.readlines()

for line in Wlines:
    Wspl=line.split()
    for line2 in Mlines:
        Mspl=line2.replace('\n','').split("\t")
        if ((Mspl[0]).lower()==(Wspl[0])):
            Wspl.append(Mspl[1])
            if(len(Mspl)>=3):
                Wspl.append(Mspl[2])
                s="\t".join(Wspl)+"\n"
            if s not in filtred:
                filtred.append(s)
                break
for x in filtred:
    w.write(x)
f.close()
d.close()
w.close()

使用 else 语句,我希望 else if ((Mspl [0])。lower()==(Wspl [0])):

import re
f = open('C:\Users\Ziad\Desktop\Combination\MikrofullCombMaj.txt', 'r')
d = open('C:\Users\Ziad\Desktop\Combination\WhatsappResult.txt', 'r')
w = open('C:\Users\Ziad\Desktop\Combination\combination.txt','w')
s=""
av =0
b=""
filtred=[]
Mlines=f.readlines()
Wlines=d.readlines()
for line in Wlines:
    Wspl=line.split()
    for line2 in Mlines:
        Mspl=line2.replace('\n','').split("\t")
        if ((Mspl[0]).lower()==(Wspl[0])):
            Wspl.append(Mspl[1])
            if(len(Mspl)>=3):
                Wspl.append(Mspl[2])
                s="\t".join(Wspl)+"\n"
            if s not in filtred:
                filtred.append(s)
                break
        else:
            b="\t".join(Wspl)+"\n"
            if b not in filtred:
                filtred.append(b)
                break
for x in filtred:
    w.write(x)
f.close()
d.close()
w.close()

1 个答案:

答案 0 :(得分:3)

首先,除了导入代码之外,你在代码中根本不使用“re”(可能在以后的某些部分?)所以标题有点误导。

其次,你正在为两个文件的基本过滤操作做很多工作。请记住,简单比复杂更好,所以对于初学者来说,你想稍微清理你的代码:

  1. 你应该使用比'd'或'w'更多的指示性名称。这也适用于'Wsplt','s'和'av'。这些名称并不意味着什么,并且很难理解(为什么d.readlines在另一个名为'w'的文件中命名为Wlines?这真的令人困惑)。
  2. 如果你选择使用单个字母,它应该仍然有意义(如果你遍历一个名为'results'的列表,使用'r'是有意义的。'line1'和'line2'然而,不推荐任何东西)
  3. 条件不需要括号
  4. 您希望尽可能少地使用变量,以免混淆。代码中有太多不同的变量,很容易迷失。你甚至不使用其中的一些。
  5. 你想使用strip而不是替换,你希望整个'清理'过程先来,然后只需要一个代码来处理两个列表上的过滤逻辑。如果你根据某些逻辑拆分每一行,并且你没有在迭代中的任何地方使用原始行,那么你可以在开始时完成所有工作。
  6. 现在,我真的很困惑你在这里想要实现的目标,虽然我不明白为什么你这样做,我可以说,看着你的逻辑,你正在重复自己。检查已过滤列表的操作应该只发生一次,并且由于无论“if”是否检出都会发生,我完全没有理由使用“else”子句。

    像我提到的清理,并重新构建逻辑,脚本看起来像这样:

    # PART I - read and analyze the lines
    Wappresults = open('C:\Users\Ziad\Desktop\Combination\WhatsappResult.txt', 'r')
    Mikrofull = open('C:\Users\Ziad\Desktop\Combination\MikrofullCombMaj.txt', 'r')
    
    Wapp = map(lambda x: x.strip().split(), Wappresults.readlines())
    Mikro = map(lambda x: x.strip().split('\t'), Mikrofull.readlines())
    
    Wappresults.close()
    Mikrofull.close()
    
    # PART II - filter using some logic
    filtred = []
    
    for w in Wapp:
        res = w[:] # So as to copy the list instead of point to it
        for m in Mikro:
            if m[0].lower() == w[0]:
                res.append(m[1])
                if len(m) >= 3 : 
                    res.append(m[2])
    
            string = '\t'.join(res)+'\n' # this happens regardles of whether the 'if' statement changed 'res' or not
            if string not in filtred:
                filtred.append(string)
    
    
    # PART III - write the filtered results into a file
    combination = open('C:\Users\Ziad\Desktop\Combination\combination.txt','w')
    for comb in filtred:
        combination.write(comb)
    combination.close()
    

    我不能保证它会起作用(因为我再说,我不知道你想要做什么)但这应该更容易使用。