Как находить одинаковые числа(элементы) из N числа файлов
Есть алгоритм создания рандомных файлов с рандомными числами
from random import *
for i in range(randint(2,10)):
with open(r"E:\result\file{}.txt".format(i), "w") as f:
for a in range(i + 1): #Без + 1 один файл не заполняется
list_1 = [randint(1,1000)for b in range(randint(1,10000))]
f.writelines(str(list_1))
with open(r"E:\result\file{}.txt".format(i), "r") as fil:
print(fil.read())
Если к примеру сгенерируется 5 файлов и в каждом из них будет одинаковое(Рандомное) число,
то создать отдельный файл с названием result.txt в котором будут только эти одинаковые числа
как это осуществить?
Ответы (1 шт):
Автор решения: cauf
→ Ссылка
Все пояснения привел в виде комментариев в самом коде
from random import *
from pathlib import Path
# определим путь до базового каталога
base_path = Path(r'path\to\folder')
# создадим пустой список для хранения содержимого всех файлов
all_contents = []
# определим количество итераций
iters = randint(2,10)
# определим список результатов
res = []
# ============================== ГЕНЕРАЦИЯ ДАННЫХ ==============================
# Укажите нижнюю границу генерируемого диапазона = 1.
# К количеству итераций нужно прибавить 1,
# так как верхняя граница не входит в диапазон.
for i in range(1, iters + 1):
# сгенерируем название файла через f-строку
fl_name = f'file{i}.txt'
# используйте объекты Path для генерации путей
# обязательно указывайте кодировку файлов, иначе могут быть неожиданности
with open(base_path / fl_name, "w", encoding='utf-8') as f:
# определим список для хранения содержимого всего файла
fl_content = []
for a in range(i):
# сгенерируем содержимое куска файла
chunck_content = [
str(randint(1,1000))
for b in range(randint(1,10000))
]
# добавим его к содержимому всего файла
fl_content += chunck_content
# добавим содержимое файла к содержимому всех файлов
all_contents.append(fl_content)
# запишем содержимое файла, сгенерировав строку из списка с разделителем
f.write(', '.join(fl_content))
# =================================== АНАЛИЗ ===================================
# присвоим результату содержимое первого файла
res = all_contents[0]
# обойдем содержимое всех оставшихся файлов в цикле
for content in all_contents[1:]:
# на каждой итерации оставляем только те числа,
# которые встречались во всех предыдущих
# Здесь списки приводят к множествам, которые поддерживают операцию
# пересечения, результат снова приводим к списку
res = list(set(res) & set(content))
# если длинна списка с результатами больше 0
if len(res) > 0:
# записываем результат в файл
with open(base_path / 'results.txt', 'w', encoding='utf-8') as fl:
fl.write(', '.join(res))