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

f1 = open("file1.txt","r")
f2 = open("file2.txt","r")

duplicate = open("duplicate_ip.txt", "w")
unique = open("unique_ip.txt", "w")

for x in f1:

    for y in f2:
        if x == y:
            duplicate.write(y)
        else:

            unique.write(x)

File1.txt содержит следующее

192.168.1.1
192.168.10.2
192.168.56.5
192.16.10.2
192.168.5.5

File2.txt содержит следующее

192.168.1.2
10.10.10.0
10.10.10.11
192.168.11.111
127.0.0.1
172.16.31.5
-1
unkn0wnr1d3r 4 Фев 2022 в 14:32
Вы только открыли файл.. но не прочитали его
 – 
Harsha Biyani
4 Фев 2022 в 14:35
Файл, на который ссылается f2, исчерпан после первого запуска for y in f2.
 – 
Matthias
4 Фев 2022 в 15:19
Конечно файл читается. Может быть, вы не знаете об этом, но файл невозможен. С for x in f1 вы получаете каждую строку в f1.
 – 
Matthias
4 Фев 2022 в 15:21

4 ответа

Если вы хотите, чтобы f1 и f2 были списком строк, используйте метод readlines(). Также не забудьте закрыть файлы (по крайней мере, те, в которые вы пишете).

f1 = open("file1.txt", "r").readlines()
f2 = open("file2.txt", "r").readlines()

duplicate = open("duplicate_ip.txt", "w")
unique = open("unique_ip.txt", "w")

for x in f1:

    for y in f2:
        if x == y:
            duplicate.write(y)
        else:

            unique.write(x)
f1.close()
f2.close()
duplicate.close()
unique.close()

Но есть очень простой способ управлять сессиями файлового ввода-вывода с использованием менеджера контекста. Тогда ваш код будет выглядеть примерно так

with open("file1.txt", "r") as f1, \
        open("file2.txt", "r") as f2, \
        open("duplicate_ip.txt", "w") as duplicate, \
        open("unique_ip.txt", "w") as unique:
    f1_lines = f1.readlines()
    f2_lines = f2.readlines()
    for x in f1_lines:

        for y in f2_lines:
            if x == y:
                duplicate.write(y)
            else:

                unique.write(x)
2
sudden_appearance 4 Фев 2022 в 14:45

Решение с операцией множества & (пересечение) и ^ (операция исключающее ИЛИ)

f1_ip = set(open("file1.txt","r"))
f2_ip = set(open("file2.txt","r"))

with open("duplicate_ip.txt", "w") as duplicate:
    for ip in f1_ip & f2_ip:
        duplicate.write(ip)

with open("unique_ip.txt", "w") as unique:
    for ip in f1_ip ^ f2_ip:
        unique.write(ip)
1
Eugene 4 Фев 2022 в 14:47
Обратите внимание, что порядок будет потерян здесь - не уверен, что это имеет значение
 – 
Holloway
4 Фев 2022 в 15:07
Конечно. Если автору нужно сохранить порядок, он может установить и записать в файл, например if in unique then unique_f.write(ip) else duplicate_f.write(ip). В ответ только идея для фильтра.
 – 
Eugene
4 Фев 2022 в 15:12

Можно написать так:

with open("file1.txt", "r") as f1:
    data1 = set()
    for line in f1.readlines():
        data1.add(line.strip('\n'))

with open("file2.txt", "r") as f2:
    data2 = set()
    for line in f2.readlines():
        data2.add(line.strip('\n'))

unique_list = data1.difference(data2)
duplicate_list = data1.intersection(data2)

with open("duplicate_ip.txt", "w") as duplicate:
    for ip in duplicate_list:
        duplicate.write(ip+ "\n")

with open("unique_ip.txt", "w") as unique:
    for ip in unique_list:
        unique.write(ip+ "\n")
0
Zahra Ebrahimi 4 Фев 2022 в 15:08

Чтобы ответить на вопрос, вы открываете файл, но не читаете строки, поэтому на самом деле вы не перебираете файл.

Пара комментариев:

  • вы должны попытаться открыть файлы, используя with, чтобы случайно не оставить их открытыми
  • это все равно не сработает, так как в последней строке не будет \n, поэтому вам, вероятно, следует удалить их, используя .replace
  • вы проверяете только один способ, любые ips в файле2, которые не находятся в файле 1, не будут найдены таким образом, не уверен, что это то, что вы хотите
  • есть более быстрые способы проверить, какие элементы одинаковы в двух списках, а какие уникальны.

Для решения основного вопроса:

with open("file1.txt","r") as f1:
    data1 = f1.readlines()

with open("file2.txt","r") as f2:
    data2 = f2.readlines()

with open("duplicate_ip.txt", "w") as duplicate,   
     open("unique_ip.txt", "w") as unique:
        
        for x in data1:
        
            for y in data2:
                if x == y:
                    duplicate.write(y)
                else:
        
                    unique.write(x)
0
Nathan 4 Фев 2022 в 15:25
Вы можете избежать использования вложенных контекстных менеджеров, разделив их запятой)
 – 
sudden_appearance
4 Фев 2022 в 14:46
Обновил это
 – 
Nathan
4 Фев 2022 в 15:25
Это не удастся, используйте обратную косую черту после duplicate, )
 – 
sudden_appearance
4 Фев 2022 в 15:27