From 51f5d2df112ec2cba942bf812963a0de5d908fee Mon Sep 17 00:00:00 2001 From: Yury Kiselev Date: Fri, 4 Apr 2025 10:49:58 +0300 Subject: [PATCH] [04/04/2025] init --- main.py | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..d61bf73 --- /dev/null +++ b/main.py @@ -0,0 +1,106 @@ +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()