if-else语句在for循环中无法正常运行

时间:2018-09-30 00:21:22

标签: python python-3.x file

我正在尝试在for循环中使用if-else语句来计算两个单独的字符串中的不同字符。但是,它永远不会计算不同的字符。

        for char in range(len(f1CurrentLine)):  # Compare line by line
            if f1CurrentLine[char] != f2CurrentLine[char]:  # If the lines have different characters
                print("Unmatched characters: ", count, ":", char)
                diffCharCount = diffCharCount + 1  # add 1 to the difference counter
                count = count + 1
                text1Count = text1Count + len(f1CurrentLine)
                text2Count = text2Count + len(f2CurrentLine)
                return CharByChar(count=count, text2Count=text2Count, text1Count=text1Count,
                                   diffCharCount=diffCharCount)  # return difference count
            else:
                print("Characters matched in line:", count, ". Moving to next line.")
                text1Count = text1Count + len(f1CurrentLine)
                text2Count = text2Count + len(f2CurrentLine)
                count = count + 1
                return CharByChar(count, diffCharCount=diffCharCount, text1Count=text1Count,
                                   text2Count=text2Count,
                                   diffLineCount=diffLineCount)

我有两个文件,其中有以下文件

文件1:

1个Hello World

2个炫目

3个foobar

文件2:

1个Hello world

2个炫目

3个fooBar

它应该返回2个不同的字符,但不会。如果您想看一看整个功能,我在这里链接了它:Pastebin。希望你能看到我错过的东西。

2 个答案:

答案 0 :(得分:2)

对于这种应用程序,您的代码太复杂了。我已尽力理解代码,并提出了更好的解决方案。

text1 = open("file1.txt")
text2 = open("file2.txt")

# Difference variables
diffLineCount = diffCharCount = line_num = 0


# Iterate through both files line by line
for line1, line2 in zip(text1.readlines(), text2.readlines()): 
    if line1 == "\n" or line2 == "\n": continue # If newline, go to next line
    if len(line1) != len(line2): # If lines are of different length
        diffLineCount += 1
        continue # Go to next line
    for c1, c2 in zip(list(line1.strip()), list(line2.strip())): # Iterate through both lines character by character
        if c1 != c2: # If they do not match
            print("Unmatched characters: ", line_num, ":", c1)
            diffCharCount += 1
    line_num += 1

# Goes back to the beginning of each file
text1.seek(0)
text2.seek(0)

# Prints the stats
print("Number of characters in the first file: ", len(text1.read()))
print("number of characters in the second file: ", len(text2.read()))
print("Number of characters that do not match in lines of the same length: ", diffCharCount)
print("Number of lines that are not the same length: ", diffLineCount)

# Closes the files
text1.close()
text2.close()

我希望您了解它的工作原理,并能够使其特别适合您的需求。祝你好运!

答案 1 :(得分:1)

Ciao

不同于我编辑您的代码的其他解决方案,以便您可以了解出了什么问题。我同意他的观点,因为它很复杂,您还是应该组织更好的代码

text1 = open("file1.txt")
text2 = open("file2.txt")


def CharByChar(count, diffCharCount, text1Count, text2Count, diffLineCount):
    """
    This function compares two files character by character and prints the number of characters that are different
    :param count: What line of the file the program is comparing
    :param diffCharCount: The sum of different characters
    :param text1Count: Sum of characters in file 1
    :param text2Count: Sum of characters in file 2
    :param diffLineCount: Sum of different lines
    """
    # see comment below for strip removal
    f1CurrentLine = text1.readline()
    f2CurrentLine = text2.readline()

    while f1CurrentLine != '' or f2CurrentLine != '':
        count = count + 1
        print(f1CurrentLine)
        print(f2CurrentLine)
        #if f1CurrentLine != '' or f2CurrentLine != '':
        if len(f1CurrentLine) != len(f2CurrentLine):  # If the line lengths are not equal return the line number
            print("Lines are a different length. The line number is: ", count)
            diffLineCount = diffLineCount + 1
            count = count + 1
            #text1Count = text1Count + len(f1CurrentLine)
            #text2Count = text2Count + len(f2CurrentLine)
            # return CharByChar(count)
        elif len(f1CurrentLine) == len(f2CurrentLine):  # If the lines lengths are equal    
            for char in range(len(f1CurrentLine)):  # Compare line by line
                print(char)
                if f1CurrentLine[char] != f2CurrentLine[char]:  # If the lines have different characters
                    print("Unmatched characters: ", count, ":", char)
                    diffCharCount = diffCharCount + 1  # add 1 to the difference counter
                    #count = count + 1
                    text1Count = text1Count + len(f1CurrentLine)
                    text2Count = text2Count + len(f2CurrentLine)
                    # return CharByChar(count=count, text2Count=text2Count, text1Count=text1Count,diffCharCount=diffCharCount)  # return difference count
                else:
                    print("Characters matched in line:", count, ". Moving to next char.")
                    #text1Count = text1Count + len(f1CurrentLine)
                    #text2Count = text2Count + len(f2CurrentLine)
                    #count = count + 1
                    #return CharByChar(count, diffCharCount=diffCharCount, text1Count=text1Count,text2Count=text2Count,diffLineCount=diffLineCount)
        #elif len(f1CurrentLine) == 0 or len(f2CurrentLine) == 0:
            #print(count, "lines are not matching")
            #diffLineCount = diffLineCount + 1
            #return CharByChar(diffLineCount=diffLineCount)
        else:
            print("Something else happened!")

        f1CurrentLine = text1.readline()
        f2CurrentLine = text2.readline()

    print("Number of characters in the first file: ", text1Count)
    print("number of characters in the second file: ", text2Count)
    print("Number of characters that do not match in lines of the same length: ", diffCharCount)
    print("Number of lines that are not the same length: ", diffLineCount)


def main():
    "Calls the primary function"
    CharByChar(count=0, diffCharCount=0, text1Count=0, text2Count=0, diffLineCount=0)
    input("Hit enter to close the program...")


main() #Runs this bad boi


-我认为一般的麻烦是组织CharByChar()函数来扫描文件中的所有行[这是我们在此解决方案中维护的事情],但是随后要求在每个字符检查结束时调用相同的函数
-某些部分没有理由存在:例如,在调用count时在main中设置CharByChar(),然后用if(count == 0)创建分支。您可以删除它,代码看起来会更干净
-还应删除一些变量以保持代码尽可能的干净:您永远不要使用text1Counttext2Count
-您在while上输入了一个条件,而下一个if则具有相同的条件:如果您输入了while,您还将输入if [或都不输入],这样您就可以剪掉其中之一了
-我建议您使用if len(f1CurrentLine) == 0 or len(f2CurrentLine) == 0删除分支,因为两个文件在同一行的长度都可以为0,然后行将相等[请参见下面的下一个示例]
-我建议您删除strip()以避免麻烦,以便早些中断中间带有换行符的文件的检查,例如

1 Hello

3 foobar