Python: Criar CVS (Massa de teste)

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 time

Estrutura

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.

Código Completo

Comentários