Сравнение двух текстовых файлов, удаление повторяющихся строк и запись результатов в новый текстовый файл - PullRequest
3 голосов
/ 04 августа 2011

У меня есть два текстовых файла (которые не равны по количеству строк / размеру).Я хотел бы сравнить каждую строку более короткого текстового файла с каждой строкой более длинного текстового файла.Для сравнения, если есть какие-либо повторяющиеся строки, я бы хотел удалить их.Наконец, я хотел бы записать результат в новый текстовый файл и распечатать содержимое.

Есть ли простой скрипт, который может сделать это для меня?

Любая помощь будет высоко ценится.

Текстовые файлы не очень большие.Одна имеет около 10 строк, а другая около 5. Код, который я пробовал (с треском провалился) ниже:

for line in file2:
line1 = line
for line in file1:
    requested3 = file('request2.txt','a')
    if fnmatch.fnmatch(line1,line):
        line2 = line.replace(line,"")
        requested3.write(line2)
    if not fnmatch.fnmatch(line1,line):
        requested3.write(line+'\n')


    requested3.close()

Ответы [ 4 ]

4 голосов
/ 04 августа 2011
with open(longfilename) as longfile, open(shortfilename) as shortfile, open(newfilename, 'w') as newfile:
    newfile.writelines(line for line in shortfile if line not in set(longfile))

Это так просто. Это скопирует строки из shortfile в newfile без необходимости хранить их все в памяти, если они также существуют в longfile.

Если вы работаете на Python 2.6 или старше, вам понадобится вставить оператор with:

with open(longfilename) as longfile: 
    with open(shortfilename) as shortfile:
        with open(newfilename, 'w') as newfile:

Если вы используете Python 2.5, вам нужно:

from __future__ import with_statement 

в самом верху вашего файла или просто используйте

longfile = open(longfilename) 

и т.д.. и закройте каждый файл самостоятельно.

Если вам нужно манипулировать строками, явно подойдет цикл for, важная часть - set(). Поиск элемента в наборе происходит быстро, поиск строки в длинном списке выполняется медленно.

longlines = set(line.strip_or_whatever() for line in longfile)
for line in shortfile:
    if line not in longlines:
        newfile.write(line)
2 голосов
/ 04 августа 2011

Предполагая, что оба файла представляют собой простой текст, каждая строка находится на новой строке, разделенной символами \ n новой строки:

small_file = open('file1.txt','r')
long_file = open('file2.txt','r')
output_file = open('output_file.txt','w')

try:
    small_lines = small_file.readlines()
    small_lines_cleaned = [line.rstrip().lower() for line in small_lines]
    long_file_lines = long_file.readlines()
    long_lines_cleaned = [line.rstrip().lower() for line in long_lines]

    for line in small_lines_cleaned:
        if line not in long_lines_cleaned:
            output_file.writelines(line + '\n')

finally:
    small_file.close()
    long_file.close()
    output_file.close()

Пояснение:

  1. Поскольку вы не можете заставить работать операторы 'with', мы сначала открываем файлы с помощью обычных функций open, а затем используем предложение try ... finally, чтобы закрыть их в конце программы.
  2. Мы берем маленький файл и длинный файл и сначала удаляем любые завершающие символы '\ n' (перевод строки) с помощью .rstrip (), затем делаем все символы строчными с помощью .lower (). Если у вас есть два предложения, одинаковые во всех аспектах, за исключением того, что одно имеет заглавные буквы, а другое нет, они не будут совпадать. Принуждение их к нижнему регистру избегает этого; если вы предпочитаете сравнение с учетом регистра, удалите метод .lower ().
  3. Идем построчно в small_lines_cleaned (для строки в ...) и видим, находится ли он в файле большего размера.
  4. Вывести каждую строку, если ее нет в более длинном файле; мы добавляем символ новой строки '\ n', чтобы каждая строка появлялась в новой строке вместоOfOneGiantLongSetOfStrings
1 голос
/ 04 августа 2011

Я бы использовал difflib , это упрощает сравнение / сравнение.Для этого есть хороший урок здесь .Если вы просто хотели, чтобы строки были уникальны для более короткого файла:

from difflib import ndiff

short = open('short.txt').readlines()
long = open('long.txt').readlines()

with open('unique.txt', 'w') as f:
    f.write(''.join(x[2:] for x in ndiff(short, long) if x.startswith('-')))
0 голосов
/ 04 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...