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.
Comentários