Извлечь уникальный домен, сравнивая два текстовых файла? Python - PullRequest
0 голосов
/ 06 августа 2020

Я хотел извлечь уникальный домен из файла new.txt после сравнения его с файлом old.txt.

Файл Old.txt и файл new.txt содержат список доменов, но я хотел извлечь только уникальный домен, который существует в файле new.txt после сравнения его с файлом old.txt. Короче говоря, я хотел извлечь домен, который существует только в файле new.txt.

import difflib
with open('new.txt', 'r') as newfile:
        with open('old.txt', 'r') as oldfile:
            with open('uniq.txt', 'w+') as Newdata:
                usedfile = [ x.strip('\n') for x in list(oldfile) ] #1
                masterfile = [ x.strip('\n') for x in list(newfile) ] #2
                for line in masterfile: #3
                    if line not in usedfile: #4
                        Newdata.write(line + '\n') #5
                        
        
 

Я использовал приведенный выше код python, но на выполнение sh задачи уходит много времени, Есть ли способ выполнить задачу за короткий период времени, например, используя многозадачность или многопроцессорность? Помогите, пожалуйста, у меня есть огромный список доменов для сравнения и извлечения.

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Вы должны использовать набор для содержимого старого файла, потому что проверка включения имеет временную сложность O (1) вместо O (n). Наборы неупорядочены, но для строк из старого файла (в отличие от строк из нового файла) порядок не имеет значения, потому что вы используете их только для тестирования включения.

Также это может помочь избежать чтения весь новый файл в память. Это не изменит временную сложность, но уменьшит объем памяти.

with open('old.txt', 'r') as oldfile:
    usedfile = set(x.strip('\n') for x in oldfile)

with open('new.txt', 'r') as newfile, open('uniq.txt', 'w+') as Newdata:
    for line in newfile:
        l = line.strip('\n')
        if l not in usedfile:
            Newdata.write(l + '\n')

Обратите внимание, что выражение для usedfile использует генератор - нет необходимости создавать временный список для создания set.

Отдельно от оптимизации, вы также можете sh заменить strip('\n') на strip() в двух местах, где это происходит, чтобы любые другие пробелы в начале / конце строк были также удалены, не только символы новой строки.

0 голосов
/ 06 августа 2020

использовать операции набора

with open('new.txt', 'r') as newfile:
        with open('old.txt', 'r') as oldfile:
            with open('uniq.txt', 'w+') as Newdata:
                usedfile = set([ x.strip('\n') for x in list(oldfile)]) #1
                masterfile = set([ x.strip('\n') for x in list(newfile)]) #2
                for line in masterfile.diference(usedfile):
                        Newdata.write(line + '\n') #5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...