Python Как вы сравниваете значения списка с файлом, а затем сохраняете значения в новом файле? - PullRequest
0 голосов
/ 28 июня 2019

Я новичок в python и работаю над своим финальным проектом для моего курса.Я с трудом заставляю программу искать во входном файле весь заданный список list1 и записывать положительные возвращаемые результаты в выходной файл.Я пробовал много вещей, таких как re.search, создание функции, использование разных циклов, и проблема всегда одна и та же.Он будет искать только то, что находится в list1[0].Я не могу понять, как заставить это пройти весь список.Любая помощь будет принята с благодарностью, так как я уверен, что это что-то простое, с чем я просто не знаком или полностью отсутствует.

Ожидаемый результат Программа будет искать слова всписок (точный, но без учета регистра), он скопирует строку, в которой он был найден, в новый выходной файл и затем перейдет к следующему слову в списке, пока список не будет завершен.

В настоящее времяпросто скопировать слово из первой позиции в списке в файл и не двигаться дальше.Я не уверен, копирует ли она всю строку, поскольку строка - это просто слово.

# Ask user for needed keywords or symbols
user_keywords = input("What keywords or special symbols would you like to search the provided file for?\n"
                      "Please separate each entry with a comma.\nIf you would like to just search for question marks,"
                      " please just type n.\n")
# Holding list, using comma as a way to separate the given words and symbols
list1 = list(user_keywords.split(','))
# Print list for user to see
print("You have entered the following keywords and/or special symbols: ", list1)

# Opens a new file for saving the results to.
print("Please list the path you would like the new file to save to. Example: C:\ Users \ NAME \Desktop\File name.")
outFileName = input()
outFile = open(outFileName,'w')


def filter_lines_by_keywords(lines_to_filter, key_words):
    key_words_s = set(key_words)
    return filter(lambda l: set(l.split()) & key_words_s, lines_to_filter)

# Opens the file under review.
with open(path1,'r+') as file1:
    file1lines = file1.readlines()

    res = filter_lines_by_keywords(lines_to_filter= file1lines, key_words= list1)
    outFile.write(str(list(res)))

outFile.close()

Пожалуйста, дайте мне знать, если я пропустил что-то, что нужно в коде, я думаю, чтовключил все это.Я проверил похожие темы и не смог найти ни одной, но, если она существует, сообщите мне.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Вы можете упростить то, что делаете, открыв оба файла одновременно, используя менеджер контекста, а также использовать оператор any для проверки введенных ключевых слов.

user_keywords = input("What keywords or special symbols would you like to search the provided file for?\n"
                      "Please separate each entry with a comma.\nIf you would like to just search for question marks,"
                      " please just type n.\n")

#string.split() already return a list so you dont have to turn it into a list again
list1 = [s.lower() for s in user_keywords.split(",")] #to achieve case insensitive

print("You have entered the following keywords and/or special symbols: ", list1)

print("Please list the path you would like the new file to save to. Example: C:\ Users \ NAME \Desktop\File name.")
outFileName  = input()

with open(path1, "r") as f, open(outFileName ,"w") as w:
    f = f.readlines()
    for line in f:
        if any(s in line.lower() for s in keywords): #test against all the items in keywords; return True if there is a hit
            w.write(line)
0 голосов
/ 28 июня 2019

Вы можете попробовать использовать генераторы

# Ask user for needed keywords or symbols
user_keywords = input("What keywords or special symbols would you like to search the provided file for?\n"
                      "Please separate each entry with a comma.\nIf you would like to just search for question marks,"
                      " please just type n.\n")
# Holding list, using comma as a way to separate the given words and symbols
list1 = list(user_keywords.split(','))
# Print list for user to see
print("You have entered the following keywords and/or special symbols: ", list1)

# Opens a new file for saving the results to.
print("Please list the path you would like the new file to save to. Example: C:\ Users \ NAME \Desktop\File name.")
outFileName = input()
outFile = open(outFileName,'w')

added_lines = []


def filter_lines_by_keywords(lines_to_filter, key_words):
    global added_lines
    for line in lines_to_filter:
        input_words = line.rstrip().lower().split(' ')
        for word in key_words:
            if word.lower() in input_words and line not in added_lines:
                added_lines.append(line)
                yield line


# Opens the file under review.
with open(path1,'r+') as file1:
    file1lines = file1.readlines()

    res = filter_lines_by_keywords(lines_to_filter= file1lines, key_words= list1)
    for i in res:
        outFile.write(str(i))

outFile.close()

Если вы не хотите совмещать знаки препинания, вам также придется убрать это из строки.

...