概述
Python统一社会信用代码校验
根据全国组织机构统一社会信用代码数据服务中心 标准文档进行统一社会信用代码有效性的校验。
此代码主要作为自定函数供clickhouse使用,也可单独执行,从控制台输入json进行校验。
#!/usr/bin/python3
import sys
import json
import re
# 统一信用代码
'''参考资料
1. GB 32100-2015 法人和其他组织统一社会信用代码编码规则 https://www.cods.org.cn/c/2020-10-29/12575.html
2. GB 32100-2015XG1-2016 《法人和其他组织统一社会信用代码编码规则》国家标准第1号修改单 https://www.cods.org.cn/c/2020-10-29/12574.html
3. GB 11714-1997 《全国组织机构代码编制规则》 https://www.cods.org.cn/c/2020-10-29/12582.html (附录A字符集与GB 32100-2015 字符集有差异,暂不单独校验组织机构代码)
'''
# 区域码前两位
area = ['11', '12', '13', '14', '15', '21', '22', '23', '31', '32', '33', '34', '35', '36', '37', '41', '42', '43',
'44', '45', '46', '50', '51', '52', '53', '54', '61', '62',
'63', '64', '65', '71', '81', '82', '91']
# 登记管理部门代码+机构类别代码,构成统一信用代码前两位
dep_org_code = ['11', '12', '13', '19', '21', '29', '31', '32', '33', '34', '35', '39', '41', '49', '51', '52', '53',
'59', '61', '62', '69', '71', '72', '79', '81', '89', '91', '92', '93', 'A1', 'A9', 'N1', 'N2', 'N3',
'N9', 'Y1', ]
# dep_org_code_x = ['54', '55'] # 疑似旧标准 54 农村居民委员会 55 城市居民委员会
# 加权因子 MOD(3^(i-1),31)
# wi = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
wi = [3 ** (i - 1) % 31 for i in range(1, 18)]
# 附录A 代码字符集:字符0-9对应数字0-9,字母A-Z中去掉I、O、S、V、Z后剩下的20个依次对应数字10-30(第31对应字符0)
A1 = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11, 'C': 12,
'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'J': 18, 'K': 19, 'L': 20, 'M': 21, 'N': 22, 'P': 23, 'Q': 24,
'R': 25,
'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30}
A1_reverse = {v: k for k, v in A1.items()}
if __name__ == '__main__':
for line in sys.stdin:
value = json.loads(line)
ID = value.get('sid')
if ID is None or len(ID) == 0:
msg = '统一信用代码为空'
elif len(ID) != 18:
msg = '统一信用代码不为18位'
elif re.findall(r'[^0-9A-Z]', ID):
# msg = '包含非法字符或小字母:' + ','.join(set(re.findall(r'[^0-9A-Z]', ID)))
msg = '包含非法字符或小字母'
elif re.findall(r'[IOZSV]', ID):
# msg = '包含规则外字母(I,O,Z,S,V):' + ','.join(set(re.findall(r'[IOZSV]', ID)))
msg = '包含规则外字母(I,O,Z,S,V)'
elif ID[:2] not in dep_org_code:
msg = '前2位组合不符合代码要求'
elif re.findall(r'[^0-9]]', ID[2:8]) or ID[2:4] not in area:
msg = '第3~8位行政区划代码错误'
# elif 9~17位组织机构代码
else:
c = 0
for i in range(17):
# print(ID[i], A1[ID[i]], A1[ID[i]] * wi[i])
c += A1[ID[i]] * wi[i]
# print('C:%s' % c)
c18 = 31 - c % 31
cc = A1_reverse[c18] if c18 != 31 else '0'
# print('校验码:%s' % t)
if cc != ID[-1]:
# msg = '校验码错误,应为%s' % cc
msg = '校验码错误'
else:
msg = '1' # 统一信用代码合法
data = {'result': msg}
print(json.dumps(data), end='n')
sys.stdout.flush()
最后
以上就是笑点低石头为你收集整理的统一社会信用代码校验的全部内容,希望文章能够帮你解决统一社会信用代码校验所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复