Проверка различий, введите имя файла вместо указания файла - PullRequest
0 голосов
/ 05 февраля 2020

Итак, у меня есть этот код, он в основном работает нормально, если я указываю указанный файл c для сравнения: но как только я создаю переменную, позволяющую пользователю вводить имя файла, а затем сравниваю, я получаю следующие ошибки .

Вот мой код в настоящее время.

def open_file_and_return_list(file_path):
    list = []
    with open(file_path, 'r') as f:
        line = f.readline()
        while line:
            list.append(line)
            line = f.readline()
    return list


def clean_new_line(list):
    for i in range(len(list)):
        if "\n" in list[i]:
            list[i] = list[i].replace("\n", "")
    return list


if __name__ == "__main__":
    s1 = input("INFO: Select the first file to compare: ")
    s2 = input("INFO: Select the first file to compare: ")
    list1 = open_file_and_return_list(r"new.txt")
    list2 = open_file_and_return_list(r"standard.txt")
    maxl = max(len(list1), len(list2))
    list1 += [''] * (maxl - len(list1))
    list2 += [''] * (maxl - len(list2))
    diff = []
    diff_file = input("\nINFO: Select what to name the difference(s) : ")
    open(diff_file, 'w').close()

    for iline, (l1, l2) in enumerate(zip(list1, list2)):
        if l1 != l2:
            print(iline, l1, l2)
            print(iline, l1, l2, file=open(diff_file, 'a'))

Я получаю ошибку:

 list1 = open_file_and_return_list('r', s1)
 TypeError: open_file_and_return_list() takes 1 positional argument but 2 were given

Я хочу разрешить пользователю снова указывать файлы сравнивать, так как у них всегда будут разные имена и они будут "джокерами"

    s1 = input("INFO: Select the first file to compare: ")
    s2 = input("INFO: Select the first file to compare: ")

Что я делаю не так? Мой логик c совершенно не в порядке? Или мои застекленные глаза пропускают что-то маленькое.

РЕДАКТИРОВАТЬ

Точный код, который я использую:

elif device_type == "7":
print("\n")
print("************************************")
print("*****                          *****")
print("*****   Comparision Checker    *****")
print("*****    Of Two Configs        *****")
print("************************************")
print("\n")
print('\nWARNING: Discrepancies found:')


def open_file_and_return_list(file_path):
    list = []
    with open(file_path, 'r') as f:
        line = f.readline()
        while line:
            list.append(line)
            line = f.readline()
    return list


def clean_new_line(list):
    for i in range(len(list)):
        if "\n" in list[i]:
            list[i] = list[i].replace("\n", "")
    return list


if __name__ == "__main__":
    s1 = input("INFO: Select the first file to compare: ")
    s2 = input("INFO: Select the first file to compare: ")
    list1 = open_file_and_return_list(r"new.txt")
    list2 = open_file_and_return_list(r"standard.txt")
    maxl = max(len(list1), len(list2))
    list1 += [''] * (maxl - len(list1))
    list2 += [''] * (maxl - len(list2))
    diff = []
    diff_file = input("\nINFO: Select what to name the difference(s) : ")
    open(diff_file, 'w').close()

    for iline, (l1, l2) in enumerate(zip(list1, list2)):
        if l1 != l2:
            print(iline, l1, l2)
            print(iline, l1, l2, file=open(diff_file, 'a'))

Как вы заметили, если я задаю имя файла standard.txt и new.txt, код выполняется безупречно, но при попытке добавить свои собственные переменные происходит сбой.

1 Ответ

0 голосов
/ 05 февраля 2020

Следующий код:

list1 = open_file_and_return_list('r', s1)

Подразумевает, что функция называется open_file_and_return_list(), первый аргумент - 'r', а второй аргумент - s1. Однако функция определяется в верхней части кода следующим образом:

def open_file_and_return_list(file_path):

, что говорит Python, что функция должна разрешать сохранение только одного аргумента в качестве переменной file_path. В результате Python сохраняет 'r' как file_path и не знает, что делать с s1 в исходном вызове функции.

На основе того, как остальные код написан, кажется, что 'r' должен был быть частью такого утверждения, как r"new.txt". Однако для указанного c кода, указанного в вопросе, 'r' не требуется, и должна быть возможность просто передать путь к файлу, хранящийся в s1:

list1 = open_file_and_return_list(s1)
...