120 lines
5.2 KiB
Python
120 lines
5.2 KiB
Python
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()
|