pool_generator/main.py

120 lines
5.2 KiB
Python
Raw Permalink 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 years_old, 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_male_more_0y = 52.5
percent_for_male_more_25y = 46
percent_for_male_more_50y = 25
percent_for_male_more_75y = 10
# номер телефона (идет инкремент 1 после каждого использования) и окончание почты
mobile_global = 89991000000
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):
# выбор возраста и процента для выбора гендера
years_old, birthday = generate_random_birthday(18, 99)
if years_old <= 25:
temp_percent = percent_for_male_more_0y
elif years_old <= 50:
temp_percent = percent_for_male_more_25y
elif years_old <= 75:
temp_percent = percent_for_male_more_50y
else:
temp_percent = percent_for_male_more_75y
temp_gender = gender_list[0] if (round(random.uniform(1, 100), 2) <= temp_percent) else gender_list[1]
gender = temp_gender["gender"]
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"]
email = generate_random_string(abc_en, random.randint(10, 20)) + email_global
snils = generate_random_snils()
snils_f = f"{snils[0:3]}-{snils[3:6]}-{snils[6:9]} {snils[9:11]}" # форматирование снилса для вывода
mobile_global += 1 # инкремент чтобы обновить глобальный номер
file.write(f"{first_name},{last_name},{patronymic},{gender},{birthday},{mobile_global},{email},{snils_f}\n")
# закрываем работу с файлом
file.close()