Python: печатать похожие слова из нескольких файлов, исключать слова из одного файла и выводить результат в новый файл? - PullRequest
0 голосов
/ 03 декабря 2018

Я беру вводный курс по Python.В настоящее время я работаю с Python 3.7.1.У меня есть 6 текстовых файлов: file_a.txt, file_b.txt, file_c.txt, file_d.txt, file_e.txt и stop_words.txt

. Мне нужно сравнить файлы от 'a' до 'e' и найтислова, которые появляются во всех них.Я должен записать полученные слова в новый файл («Compare_out.txt»).Тем не менее, ни одно из слов в файле stop_words.txt не может отображаться в textcompare.txt.

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

Вот что я получил до сих пор.Я пытался работать только с file_a, чтобы увидеть, что я мог сделать, но код печатает только самое последнее слово текстового файла.Я знаю, что должен был использовать \ n, чтобы сделать его красивее, но, похоже, он испортил код.Это также происходит, если я исключаю 'encoding =' utf-8 '' в каждом открываемом мной файле:

import os
os.chdir(#path)
with open('file_a.txt', 'r', encoding = 'utf-8') as a, open('file_b.txt', 'r', encoding = 'utf-8') as b, open('file_c.txt', 'r', encoding = 'utf-8') as c, open('file_d.txt', 'r', encoding = 'utf-8') as d, open('file_e.txt', 'r', encoding = 'utf-8') as e:
lines_a = a.readlines()
for line in lines_a:
    words_a = line.split()
    for word in words_a:
        ufil = open('compare_out.txt', 'w', encoding = 'utf-8')
        ufil.write(word)
        ufil.close()

Заранее спасибо, и, пожалуйста, извините, если на этот вопрос уже был дан ответ.Я сделал все возможное, чтобы найти что-то сложное в последние пару дней.

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Добро пожаловать сюда!Прежде всего, я думаю, что вам нужно разделить вашу программу на отдельные действия.Не пытайтесь делать все сразу.Вы также должны учитывать, что вам не нужно проверять каждое слово каждого файла.Позвольте мне объяснить.

Для каждого шага вашего алгоритма вы будете сравнивать две сущности.Первый раз файл A сравнивается с файлом B, и общие слова будут внесены в список.Во второй раз два объекта будут в этом списке с общими словами и файлом C. Из этого списка будут удалены все слова, которых нет в файле C.Вы делаете это для каждого файла до конца.

Я пытался сделать это, еще не проверял, но это дает вам первое понимание:

from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 
import os
os.chdir(#path)

files_names = ["file_a.txt", "file_b.txt", "and so on"]
common_list = None # will hold the list common words

stop_words = # assuming you have list of stop words 

for i in range(1, len(file_names)):
    # Declare variables
    left = None
    right = None

    # If this is the first loop, get the 0 element of the list (file_a.txt)
    if not common_list:
        with(files_names[i-1], 'r' as f:
            left = f.read().replace('\n', '')
    else: # If not, get the common list
        left = common_list

    # Get the right file
    with open(files_names[i], 'r') as f:
        right = f.read().replace('\n', '')

    # convert string into list
    left = word_tokenize(left)
    right = word_tokenize(right)

    # removing stop words from this list
    left = [w for w in left if not w in stop_words] 
    right = [w for w in right if not w in stop_words] 

    # removing words from common_list hold in right variable
    # that is not on the right file
    left = [w for w in left if not w in right]

    # Put left in common_list for next loop
    common_list = left

    # write your result in file
    with open('compare_out.txt', 'w') as out:
        out.write(common_list)
        out.close()

Итак, вот шаг:

  • Получить файл a и файл b, поместить его в список и удалить стоп-слова с помощью nltk
  • Сравнить этот файл и поместить результат в common_list
  • Получить файл c,поместите его в список и удалите стоп-слова
  • Удалите слово из общего списка, которого нет в файле c
  • Сделайте это снова с файлом d и т. д. до конца.
0 голосов
/ 03 декабря 2018

Пример ниже.Предложите изучить каждую концепцию и, если это не имеет смысла, переписать эту часть так, как вам нравится.Читайте дальше:

  • для циклов
  • структуры данных, список [] и set ()
  • обработка строк, чередование пробелов

        import os
        #os.chdir(#path) //assume files in same directory as *.py file
    
        def read_words_from_list_of_files(list_of_file_names):
            """From a list of files returns a set of words contained in the files"""
            # Make a list of words from the file (assume words separated by white space)
            words_list = []
            for file_name in list_of_file_names:
                with open(file_name, 'r', encoding = 'utf-8') as f:
                    for line_read in f:
                        line = line_read.strip()
                        words_in_this_line = line.split(" ")
                        words_list += words_in_this_line
            return set(words_list)
    
        FILES_OF_INCLUDED_WORDS = ['file_a.txt', 'file_b.txt', 'file_c.txt', 'file_d.txt',  'file_e.txt']
        EXCLUDED_WORDS_FILES = ['stop_words.txt']
        OUTPUT_FILE_NAME = 'compare_out.txt'
        set_of_words_to_include = read_words_from_list_of_files(FILES_OF_INCLUDED_WORDS)
        set_of_words_to_exclude = read_words_from_list_of_files(EXCLUDED_WORDS_FILES)
        # Make a set to eliminate duplicates in the list
        set_of_remaining_words = set_of_words_to_include - set_of_words_to_exclude
        with open(OUTPUT_FILE_NAME, 'w') as f:
            for word in set_of_remaining_words:
                f.write(word + " ") #There will be a space after the last word but maybe this is OK
        print(set_of_remaining_words)
    
0 голосов
/ 03 декабря 2018
_all = []
with open('file_a.txt', 'r', encoding = 'utf-8') as a:
    a_list = a.read().split(' ')
    _all.append(a_list)
    with open('file_b.txt', 'r', encoding = 'utf-8') as b:
        b_list = b.read().split(' ')
        _all.append(b_list)
        with open('file_c.txt', 'r', encoding = 'utf-8') as c:
            c_list = c.read().split(' ')
            _all.append(c_list)
            with open('file_d.txt', 'r', encoding = 'utf-8') as d:
                d_list = d.read().split(' ')
                _all.append(d_list)
                with open('file_e.txt', 'r', encoding = 'utf-8') as e:
                    e_list = e.read().split(' ')
                    _all.append(e_list)

result = set(_all[0])
for s in _all[1:]:
    result.intersection_update(s)
with open('compare_out.txt', 'w', encoding = 'utf-8') as ufill:
for each in result:
    ufill.writelines(each + '\n')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...