pool_generator/main.py
2025-04-04 10:49:58 +03:00

107 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import random
import sys
from datetime import date, timedelta
def generate_random_string(letters_string, len):
'''
Сгенерировать случайную строку с определенной длинной на основе входной строки символов
:param letters_string: строка символов для выборки
:param len: длина новой строки
:return: строка из случайных символов с указанной длинной
'''
return "".join([random.choice(letters_string) for i in range(len)])
def generate_random_birthday(years_old_from, years_old_to):
'''
Сгенерировать случайный день рождения
:param years_old_from: минимальный порог возраста для даты рождения
:param years_old_to: максимальный порог возраста для даты рождения
:return: Дата рождения в формате YYYY-mm-dd
'''
years_old = random.randint(years_old_from, years_old_to)
# выбираем случайную дату за прошлый год
start_date = date.today().replace(day=1, month=1, year=date.today().year-1).toordinal()
end_date = date.today().toordinal()
random_day = date.fromordinal(random.randint(start_date, end_date))
# из случайной даты за прошлый год вычитаем случайный возраст в границах years_old_from и years_old_to
return random_day.replace() - timedelta(days=years_old*365)
def generate_random_snils():
'''
Сгенерировать случайный СНИЛС с валидной суммой
:return: СНИЛС с валидной суммой в виде строки
'''
def check(snils_sum):
if (snils_sum == 100 or snils_sum == 101):
return 0
elif (snils_sum > 101):
return check(snils_sum % 101)
else:
return snils_sum
snils_sum = 9
snils = "1"
for i in [8, 7, 6, 5, 4, 3, 2, 1]:
temp = random.randint(0, 8)
snils += str(temp)
snils_sum += (i * temp)
snils += str(check(snils_sum))
return snils
if __name__ == '__main__':
# размер пула принимается аргументом, по умолчанию = 100
pool_len = 100
if len(sys.argv) == 2:
pool_len = int(sys.argv[-1])
# строки для выборки букв (для ФИО и почты)
abc_ru = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
abc_en = "abcdefghijklmnopqrstuvwxyz"
# гендер и соответствующее окончания Отчества и %, при котором будет выбран первый элемент списка
gender_list = [{"gender":"male", "patronymic_postfix":"вич"},
{"gender":"female", "patronymic_postfix":"овна"}]
percent_for_first_element = 46.47
# номер телефона (идет инкремент 1 после каждого использования) и окончание почты
mobile_global = 1000001
email_global = "@test.test"
# создаем файл и добавляем хедеры
file = open("./pool.csv", "w+", encoding='utf-8')
file.write("first_name,last_name,patronymic,gender,birthday,mobile,email,snils\n")
# создаем пул по размеру равный pool_len
for i in range(pool_len):
temp_gender = gender_list[0] if (round(random.uniform(1, 100), 2) <= percent_for_first_element) else gender_list[1]
first_name = generate_random_string(abc_ru, random.randint(4, 6)).capitalize()
last_name = generate_random_string(abc_ru, random.randint(6, 10)).capitalize()
patronymic = generate_random_string(abc_ru, random.randint(6, 10)).capitalize() + temp_gender["patronymic_postfix"]
gender = temp_gender["gender"]
birthday = generate_random_birthday(18, 99)
mobile = f"8999{str(mobile_global)[0:3]}{str(mobile_global)[3:5]}{str(mobile_global)[5:7]}"
mobile_global +=1
email = generate_random_string(abc_en, random.randint(10, 20)) + email_global
snils = generate_random_snils()
file.write(f"{first_name},{last_name},{patronymic},{gender},{birthday},{mobile},{email},{snils}\n")
# закрываем работу с файлом
file.close()