-4

您好,我遇到了一个问题,我不知道如何解决它。我所知道的是,当我在 if 语句中添加else语句时,python 执行总是转到else语句,即使其中有一个 true 语句语句,即使if并且可以输入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语句,我希望if ( (Mspl[0]).lower()==(Wspl[0])) 使用 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
        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()
4

1 回答 1

3

首先,除了导入它之外,您根本没有在代码中使用“re”(也许在稍后的部分?)所以标题有点误导。

其次,您为基本上是对两个文件的过滤操作做了很多工作。请记住,简单胜于复杂,因此对于初学者,您需要稍微清理一下代码:

  1. 您应该使用比“d”或“w”更具指示性的名称。这也适用于“Wsplt”、“s”和“av”。这些名称没有任何意义,而且很难理解(为什么 d.readlines 命名为 Wlines,而另一个文件名为“w”?这真的很混乱)。
  2. 如果您选择使用单个字母,它应该仍然有意义(如果您遍历名为“results”的列表,则使用“r”是有意义的。但是,不推荐使用“line1”和“line2”)
  3. 条件不需要括号
  4. 您想使用尽可能少的变量以免混淆。你的代码中有太多不同的变量,很容易迷路。你甚至不使用其中的一些。
  5. 您想使用条带而不是替换,并且您希望整个“清理”过程首先出现,然后只需要一个代码来处理两个列表上的过滤逻辑。如果您根据某种逻辑拆分每一行,并且在迭代中的任何地方都不使用原始行,那么您可以在开始时完成整个事情。

现在,我真的很困惑你想在这里实现什么,虽然我不明白你为什么这样做,但我可以说看看你的逻辑,你在重复自己很多。检查过滤列表的操作应该只发生一次,并且因为无论“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()

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

于 2013-08-22T12:57:01.730 回答