Skip to content

Instantly share code, notes, and snippets.

@lucascnr
Created November 18, 2016 19:36
Show Gist options
  • Save lucascnr/24c70409908a31ad253f97f9dd4c6b7c to your computer and use it in GitHub Desktop.
Save lucascnr/24c70409908a31ad253f97f9dd4c6b7c to your computer and use it in GitHub Desktop.
Gerador de CPF e CNPJ em Python
def generate_cpf(self):
cpf = [random.randint(0, 9) for x in range(9)]
for _ in range(2):
val = sum([(len(cpf) + 1 - i) * v for i, v in enumerate(cpf)]) % 11
cpf.append(11 - val if val > 1 else 0)
return '%s%s%s.%s%s%s.%s%s%s-%s%s' % tuple(cpf)
def generate_cnpj(self):
def calculate_special_digit(l):
digit = 0
for i, v in enumerate(l):
digit += v * (i % 8 + 2)
digit = 11 - digit % 11
return digit if digit < 10 else 0
cnpj = [1, 0, 0, 0] + [random.randint(0, 9) for x in range(8)]
for _ in range(2):
cnpj = [calculate_special_digit(cnpj)] + cnpj
return '%s%s.%s%s%s.%s%s%s/%s%s%s%s-%s%s' % tuple(cnpj[::-1])
@feliphebueno
Copy link

Muito obrigado @lucascnr, código muito útil, implementei nos nossos procedimentos de TDD aqui, já rodamos milhares de testes utilizando CPFs gerados por este método.

@rhenter
Copy link

rhenter commented Aug 8, 2019

Valeu @lucasnr, utilizei com o FactoryBoy e ficou perfeito.

@diogorb
Copy link

diogorb commented Jul 21, 2020

Valeu @lucasnr, ajudou bastante

@ricardroberg
Copy link

Sou iniciante em Python e fiz um gerador/validador de CPF achando que tava decente.
Ai eu vejo o código do @lucasnr e deito num canto em posição fetal. hehehehehehe.

Parabéns.

@ngbrito
Copy link

ngbrito commented Aug 10, 2021

Muito obrigado. Ajudou bastante aqui nos testes

@gnstrg
Copy link

gnstrg commented Oct 23, 2021

muito obrigado, me ajudo demais

@rdemetrescu
Copy link

@lucascnr usei teu código como base e dei uma simplificada nele :)

import random

def generate_cpf():
    cpf = [random.randrange(10) for _ in range(9)]

    for _ in range(2):
        value = sum([(len(cpf) + 1 - i) * v for i, v in enumerate(cpf)]) % 11
        cpf.append(11 - value if value > 1 else 0)

    return "".join(str(x) for x in cpf)


def generate_cnpj():
    cnpj = [random.randrange(10) for _ in range(8)] + [0, 0, 0, 1]

    for _ in range(2):
        value = sum(v * (i % 8 + 2) for i, v in enumerate(reversed(cnpj)))
        digit = 11 - value % 11
        cnpj.append(digit if digit < 10 else 0)

    return "".join(str(x) for x in cnpj)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment