Este é um tutorial em que será demonstrado a criação de um arquivo com os seguintes campos "cpf, matricula, sobrenome, nome, email, data de ingresso".
Este arquivo será utilizado para massa de teste.
Escopo
Para deixar o tutorial mais interessante, irei aplicar alguns modulos pouco conhecidos, segue a lista:
- csv - Módulo para manipulação de arquivos CVS;
- names - Módulo para geração de nomes aleatórios;
- rstr - Módulo para gerar sequencias numericas;
- string - Módulo para manipulação de conjuntos de caracteres alfanuméricos;
- datetime - Módulo para manipulação timestamps ;
- re - Módulo para manipulação de Expressões regulares;
- random - Módulo para manipulação de dados aleatórios;
- time - Módulo para manipulação de timestamps (hora);
se for necessário a instalação dos módulos extras, execute a linha abaixo.
pip install csv names rstr string datetime re random timeEstrutura
Para facilitar a criação do arquivo, vamos fracionar a codificação em funções.
- get_cpf para gerar cpf,
- get_matricula para gerar matricula,
- gen_nome_completo para gerar o sobrenome e o nome,
- gen_email para gerar email,
- gen_data_ingresso para gerar a data de ingresso"
- gen_massa para gerar o arquivo final com o conteúdo completo.
Codificação
Primeiro comecemos com os nomes. Vamos utilizar o Módulo names para gerar os nomes.
O formato de geração é Nome Sobrenome, assim: Edward Aspinall.
Segue o código de um metodo gerador, para geração de nomes aleatórios.
def gen_nome_completo():
    '''retorna string com nome, sobrenome'''
    while True:
        yield (names.get_full_name())
nomes = gen_nome_completo() next(nomes) Edward Aspinall
Agora utilizemos o Módulo rstr para gerar sequencia numericas. E vamos gerar numeros aleatórios de CPF.
def get_cpf():
    ''' retorna string de CPF não verificado'''
    while True:
        return '{}.{}.{}-{}'.format(
            rstr(digits, 3),
            rstr(digits, 3),
            rstr(digits, 3),
            rstr(digits, 2),
        )
get_cpf() 632.156.729-96
Para data de ingresso, foi criado um epoch hipotético iniciado entre 12 e 14, seguido de 8 digitos aleátorios, e deste epoch convertido string de data. As datas geradas são compreendidas entre 'Thu Jan 10 19:20:00 2008' e 'Thu Jul 13 23:39:59 2017' e neste formato.
def gen_data_ingresso():
    ''':return data'''
    seconds = int('{}{}'.format(
        randint(12, 14),
        rstr(digits, 8)
    ))
    return ctime(seconds)
gen_data_ingresso() Wed May 29 02:35:37 2013
Para matricula, os 4 primeiros digitos são o ano. Então o ano da matricula deverá ser o mesmo ano da data de ingresso. Por isso para gerar a matricula a função deverá receber a data de intresso como parametro.
Nesta implementação se for executada sem a string de data, a matricula será do ano corrente.
def get_matricula(data_ingresso=''):
    try:
        return '{}{}'.format(datetime.datetime.strptime(
            data_ingresso, "%a %b %d %H:%M:%S %Y").strftime("%Y"), rstr(digits, 5))
    except:
        return '{}{}'.format(datetime.datetime.now().strftime("%Y"), rstr(digits, 5))
get_matricula('Wed May 29 02:35:37 2013')
201320263
Já o email é composto pelo nome.sobrenome@dominio.com, tudo em caixa baixa.
Segue o código que recebe o nomecompleto e dominio para formar o endereço eletronico.
def gen_email(nomecompleto, dominio='incolume.com.br'):
    '''recebe nome completo e dominio, retorna email'''
    try:
        return '{}.{}@{}'.format(*(nomecompleto.lower().split()), dominio)
    except:
        return None
gen_email('Edward Aspinall')
edward.aspinall@incolume.com.br
gen_email('Edward Aspinall', 'exemplo.com')
edward.aspinall@exemplo.com
def gen_massa(qlinhas, cvsname):
    '''cria cvsname com a quantidade de linhas informadas em qlinhas '''
    try:
        header = "cpf, matricula, sobrenome, nome, email, data de ingresso"
        with open(cvsname, 'w') as file:
            csvhandler = csv.writer(file)
            csvhandler.writerow(header.split(', '))
            for i in range(qlinhas):
                nome = gen_nome_completo()
                person = next(nome)
                date = gen_data_ingresso()
                linha = '{}, {}, {c[1]}, {c[0]}, {}, {}'.format(
                    get_cpf(),
                    get_matricula(date),
                    gen_email(nomecompleto=person),
                    date,
                    c = person.split(),
                    )
                csvhandler.writerow(linha.split(','))
        return True
    except:
        raise
gen_massa(30, 'file.csv') True
Com a saída True, é gerado um arquivo como o exemplo abaixo.
Comentários