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