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