Я создал программу для сравнения двух текстовых файлов и определения повторяющихся и уникальных элементов, но сначала цикл 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
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)
Решение с операцией множества & (пересечение) и ^ (операция исключающее ИЛИ)
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)
if in unique then unique_f.write(ip) else duplicate_f.write(ip)
. В ответ только идея для фильтра.
Можно написать так:
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")
Чтобы ответить на вопрос, вы открываете файл, но не читаете строки, поэтому на самом деле вы не перебираете файл.
Пара комментариев:
- вы должны попытаться открыть файлы, используя
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)
duplicate,
)
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.
f2
, исчерпан после первого запускаfor y in f2
.for x in f1
вы получаете каждую строку вf1
.