我是靠谱客的博主 笑点低石头,最近开发中收集的这篇文章主要介绍统一社会信用代码校验,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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()

在这里插入图片描述

最后

以上就是笑点低石头为你收集整理的统一社会信用代码校验的全部内容,希望文章能够帮你解决统一社会信用代码校验所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部