1. ホーム
  2. email

[解決済み] Faker pythonで姓と名を使ったメールアドレスを生成する

2022-03-05 03:21:13

質問

人物データからなるpandasデータセットを生成しようとしています。PythonのFakerライブラリを使用しています。姓と名を用いて有効な電子メールアドレスを生成する方法はありますか?

import pandas as pd
import numpy as np
import os
import random
from faker import Faker

def faker_categorical(num=1, seed=None):
    np.random.seed(seed)
    fake.seed_instance(seed)
    output = []
    for x in range(num):
      gender = np.random.choice(["M", "F"], p=[0.5, 0.5])
      output.append(
        {
            "First name": fake.first_name_male() if gender=="M" else  
                                                 fake.first_name_female(),
            "Last name": fake.last_name(),
            "E-mail": fake.ascii_email(),  
        })
    return output

解決方法は?

Fakerの domain_name メソッドと文字列フォーマットを使って、すでに生成された値と並べて表示することができます。

first_name = fake.first_name_male() if gender =="M" else fake.first_name_female()
last_name = fake.last_name()

output.append(
    {
     "First name": first_name,
     "Last Name": last_name,
     "E-mail": f"{first_name}.{last_name}@{fake.domain_name()}"
    }
)

より完全なアプローチでは ファクトリーボーイ を追加しました。

from factory import DictFactory, LazyAttribute
from factory.fuzzy import FuzzyChoice
from factory import Faker

class PersonDataFactory(DictFactory):

    first = LazyAttribute(lambda obj: fake.first_name_male() if obj._gender == "M" else fake.first_name_female())
    last = Faker("last_name")
    email = LazyAttribute(lambda obj: f"{obj.first}.{obj.last}@{fake.domain_name()}")
    _gender = FuzzyChoice(("M", "F"))

    class Meta:
        exclude = ("_gender",)
        rename = {"first": "First Name", "last": "Last Name", "email": "E-mail"}


PersonDataFactory()


というような結果になります。

{'First Name': 'Albert',
 'Last Name': 'Martinez',
 'E-mail': '[email protected]'}