Строчно сравнивайте два разных файла и записывайте разницу в третьем файле - Python - PullRequest
3 голосов
/ 13 октября 2011

Я хотел бы сравнить два текстовых файла, каждый из которых имеет три столбца. Один файл имеет 999 строк, а другой - 757 строк. Я хочу, чтобы разные 242 строки были сохранены в другом файле. Я создал первый файл (999 строк), используя генератор случайных сетей (999 строк - ребра, третий столбец - вес между первым, вторые столбцы - исходный, конечный узлы).

Формат файла - Файлы 1, 2

1 3 1
16 36 1

Я пытался

Сравните два файла построчно и сгенерируйте разницу в другом файле а также найти разницу между двумя текстовыми файлами с одним элементом в строке и http://www.daniweb.com/software-development/python/threads/124932/610058#post610058

у меня тоже не получилось.

Я думаю, что это проблема сравнения строк. Я хотел бы сравнить числа в первом и втором столбцах. Если они оба разные, я хочу записать это в третий файл.

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

Update

Я публикую следующий код, который я попробовал после того, как @MK опубликовал свой комментарий.

f = open("results.txt","w")

for line in file("100rwsnMore.txt"):
    rwsncount += 1
    line = line.split()
    src = line[0]
    dest = line[1]
    for row in file("100rwsnDeleted.txt"):
        row = row.split()
        s = row[0]
        d = row[1]
        if(s != src and d != dest):
             f.write(str(s))
             f.write(' ')
             f.write(str(d))
             f.write('\n')

f.close()

1 Ответ

7 голосов
/ 13 октября 2011

Лучший вариант общего назначения, если вы используете систему * nix, это просто использовать:

sort filea fileb | uniq -u

Но если вам нужно использовать Python:

Ваш код повторно открывает внутренний файл на каждой итерации внешнего файла. Откройте его за пределами петли.

Использование вложенного цикла менее эффективно, чем цикл по первому, в котором сохранены найденные значения, а затем сравнение второго с этими значениями.

def build_set(filename):
    # A set stores a collection of unique items.  Both adding items and searching for them
    # are quick, so it's perfect for this application.
    found = set()

    with open(filename) as f:
        for line in f:
            # [:2] gives us the first two elements of the list.
            # Tuples, unlike lists, cannot be changed, which is a requirement for anything
            # being stored in a set.
            found.add(tuple(sorted(line.split()[:2])))

    return found

set_more = build_set('100rwsnMore.txt')
set_del = build_set('100rwsnDeleted.txt')

with open('results.txt', 'w') as out_file:
   # Using with to open files ensures that they are properly closed, even if the code
   # raises an exception.

   for res in (set_more - set_del):
      # The - computes the elements in set_more not in set_del.

      out_file.write(" ".join(res) + "\n")      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...