Оператор if-else не работает должным образом в цикле for - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь посчитать разные символы в двух отдельных строках, используя оператор if-else в цикле for.Тем не менее, он никогда не считает разные символы.

        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 bazzle

3 foobar

Файл 2:

1 Hello world

2 bazzle

3 fooBar

Должно возвращаться 2 разных символа, но это не так.Если вы хотите взглянуть на всю функцию, я связал ее здесь: Pastebin .Надеюсь, вы увидите что-то, что я пропустил.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

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).Вы можете вырезать это, код будет выглядеть чище- некоторые переменные также должны быть удалены, чтобы сохранить код как можно более чистым: вы никогда не используете text1Count и text2Count- вы вводите с условием для while, а следующее if имеет такое же условие: если вы ввели while, вы также введете if [или ни одного из них], чтобы вы могли вырезать одно из нихиз- Я предлагаю вам удалить ветку с if len(f1CurrentLine) == 0 or len(f2CurrentLine) == 0, потому что оба файла могут иметь длину 0 для одной и той же строки, и тогда строки будут равны [см. Следующий пример ниже]- Я предлагаю вам удалить strip(), чтобы избежать проблем с прерыванием проверки ранее для файлов, в которых есть новые строки в середине, например,

1 Hello

3 foobar
0 голосов
/ 30 сентября 2018

Ваш код слишком сложен для такого рода приложений.Я изо всех сил пытался понять код, и я нашел лучшее решение.

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()

Я надеюсь, вы понимаете, как это работает, и способны сделать его специально для ваших нужд.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...