Uma mistura do código do amigo Pedro Werneck em http://www.pythonbrasil.com.br/moin.cgi/VerificadorDeCpf e do amigo Michel Thadeu Sabchuk em http://www.pythonbrasil.com.br/moin.cgi/VerificadorDeCnpj.
Este código roda no Zope.
1 ## Script (Python) "valida_CNPJ"
2 ##bind container=container
3 ##bind context=context
4 ##bind namespace=
5 ##bind script=script
6 ##bind subpath=traverse_subpath
7 ##parameters=cnpj
8 ##title=
9 ##
10
11 #Baseado nos códigos de Pedro Werneck e Michel Thadeu Sabchuk
12 #http://www.pythonbrasil.com.br/moin.cgi/VerificadorDeCpf
13 #http://www.pythonbrasil.com.br/moin.cgi/VerificadorDeCnpj
14 #Adaptado para o Zope por Cleber J Santos
15
16 cnpj = context.REQUEST.get('cnpj',None)
17 cnpj_invalidos = [15*str(i) for i in range(10)]
18
19
20 if not cnpj.isdigit():
21 """ Verifica se o CPF contem pontos, hifens e Barras """
22 cnpj = cnpj.replace(".", "")
23 cnpj = cnpj.replace("-", "")
24 cnpj = cnpj.replace("/", "")
25
26 if (not cnpj) or (len(cnpj) < 14):
27 return False
28
29 elif cnpj in cnpj_invalidos:
30 return False
31
32 else:
33 """ Pega apenas os 12 primeiros dígitos do CNPJ e gera os 2 dígitos que faltam """
34 inteiros = map(int, cnpj)
35 novoCnpj = inteiros[:12]
36
37 prod = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
38 while len(novoCnpj) < 14:
39 r = sum([x*y for (x, y) in zip(novoCnpj, prod)]) % 11
40 if r > 1:
41 f = 11 - r
42 else:
43 f = 0
44 novoCnpj.append(f)
45 prod.insert(0, 6)
46
47
48 """ Se o número gerado coincidir com o número original, é válido """
49 if novoCnpj == inteiros:
50 return bool(novoCnpj == inteiros)
51 return False