前言
关于车辆的VIN码简单的介绍:VIN是英文Vehicle Identification Number(车辆识别码)的缩写。因为SAE标准规定:VIN码由17位字符组成,所以俗称十七位码。它包含了车辆的生产厂家、年代、车型、车身型式及代码、发动机代码及组装地点等信息。正确解读VIN码,对于我们正确地识别车型,以致进行正确地诊断和维修都是十分重要的。(来自百度百科)
一、VIN码的校验方法
VIN码各位数字和字母=》对应值
VIN码从第1位到第17位,位数的加权值
计算方法:VIN前8位和后8位对应值乘以位数的加权值相加,除以11,所得余数是否与第9位数相等,一样为对,不一样就是错的。
补充说明:VIN码是没有O和I的,但是再输入的时候允许你输错,自动以为你输入的是0。也就是说你输入Q,O默认为0,输入I默认为1
二、程序实现
我也上网搜过类似的文章,有C,java语言实现的,但没找用python的,我想python应该也能实现,下面是个人方法,可能会比较繁琐
1.需要使用的库
import pandas as pd
pandas库是非常强大的,他的表关系正好能实现字母与数字的对应关系:
安装pip install pandas
2.完整代码
代码如下(示例):
import pandas as pd
from pandas.core.frame import DataFrame
lists = {
"A": 1,
"B": 2,
"C": 3,
"D": 4,
"E": 5,
"F": 6,
"G": 7,
"H": 8,
"J": 1,
"K": 2,
"L": 3,
"M": 4,
"N": 5,
"P": 7,
"R": 9,
"S": 2,
"T": 3,
"U": 4,
"V": 5,
"W": 6,
"X": 7,
"Y": 8,
"Z": 9,
"0": 0,
"1": 1,
"2": 2,
"3": 3,
"4": 4,
"5": 5,
"6": 6,
"7": 7,
"8": 8,
"9": 9,
}
df = pd.DataFrame(lists,index=[0])#变成dataframe类型,打印结果如下效果
# A B C D E F G H J K L M N ... X Y Z 0 1 2 3 4 5 6 7 8 9
#0 1 2 3 4 5 6 7 8 1 2 3 4 5 ... 7 8 9 0 1 2 3 4 5 6 7 8 9
def NUM(text):
if len(text) == 17:#判断它是否为17位数
text = text.upper()#小写字母转化为大写字母
text1 = text.replace("Q","0").replace("O","0").replace("I","1")#替换文本中的字母
num1 = int(df[text1[0]].to_string()[-1])#第一位
num2 = int(df[text1[1]].to_string()[-1])#第二位
num3 = int(df[text1[2]].to_string()[-1])#第三位
num4 = int(df[text1[3]].to_string()[-1])#第四位
num5 = int(df[text1[4]].to_string()[-1])#第五位
num6 = int(df[text1[5]].to_string()[-1])#第六位
num7 = int(df[text1[6]].to_string()[-1])#第七位
num8 = int(df[text1[7]].to_string()[-1])#第八位
num10 = int(df[text1[-8]].to_string()[-1])#第九位
num11 = int(df[text1[-7]].to_string()[-1])#第十位
num12 = int(df[text1[-6]].to_string()[-1])#第十一位
num13 = int(df[text1[-5]].to_string()[-1])#第十二位
num14 = int(df[text1[-4]].to_string()[-1])#第十三位
num15 = int(df[text1[-3]].to_string()[-1])#第十四位
num16 = int(df[text1[-2]].to_string()[-1])#第十五位
num17 = int(df[text1[-1]].to_string()[-1])#第十六位
Num1 = num1 * 8 + num2 * 7 + num3 * 6 + num4 * 5 + num5 * 4 + num6 * 3 + num7 * 2 + num8 * 10#前8位的和
Num2 = num10 * 9 + num11 * 8 + num12 * 7 + num13 * 6 + num14 * 5 + num15 * 4 + num16 * 3 + num17 * 2#后8位的和
Nums = Num1 + Num2
if Nums % 11 == int(text1[8]):
print("VIN正确:",text1)
else:
print("VIN不符合规则:",text)
else:
print("VIN位数不对")
if __name__=='__main__':
text = input('输入VIN号:')
NUM(text)