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()