Python ISBN号概述,校验位计算,10位-13位转换,验证,连字符,及常用库isbnid,isbnlib,isbntools的使用

ISBN概述

因为工作原因经常需要用到ISBN。ISBN是国际标准书号的简称(International Standard Book Number),主要用于标识文献,也即是文献的“身份证号”,通过查询ISBN号可以获取唯一的某一种书。
ISBN大致可以分为10位和13位ISBN,在2007年1月1日前用的是10位ISBN,之后用的13位ISBN。两者最显著的区别一是在10位ISBN前加上“978”或“979”,二是校验位的算法发生了变化。

ISBN算是国际商品编码的一个子集,一般在书的封底看见的条形码就是ISBN,其实我们看到10位的ISBN的书时,封底上的ISBN也是带978的,只不过以前978是默认的,当10位ISBN编号快用光的时候,又新增了979开头的ISBN,这时候为了区分编号,只能带上开始的这三位商品编码了,随之而来的最后一位校验位也发生了变化。

以现行的13位ISBN为例:9787111267768
这是《Python学习手册》第三版的ISBN号。ISBN号可以用-隔开,可以分为5段。
978-7-111-26776-8
第一段,978为商品代码。图书一般就是978,新点的是979,这是固定的3位。
第二段,7为国家、语言或者地区代码。中国为7,国别码为1-5位,按语言或国家划分,国别码越短后面能用的号码就越多,也即能代表的出版社和图书就越多。
第三段,111为出版社编码。出版社编码2-5位,编码越短说明能出版的书就越多。比如111就是机械工业出版社的代号,所以看到978-7-111这样的ISBN就说明都是机械工业出版社出版的书。
第四段,26776为书序编码。就指的是某本书在出版社的编码,直接能够确定到书。
第五段,8为校验位。校验位只有1位。

10位 ISBN检验位计算

10位ISBN的校验方法为,去掉978和最后一位的校验位,9位数字从左到右,分别与10到2相乘,然后求和,得到的和再对11进行整除,得到余数(即对11进行取模运算),再用11减去余数即为校验位。如果结果为10用X表示,余数为0,校验位位0。

例如,用13位ISBN9787111267768进行10位ISBN校验位的运算,去掉商品码978和校验位8,中间的9位为711126776。7*10+1*9+1*8+1*7+2*6+6*5+7*4+7*3+6*2,和为197197%1110,11-101,即上述ISBN用10位ISBN表示应该为7111267761

13位 ISBN检验位计算

13位ISBN的校验采用奇偶校验。方法与10位校验位类似。去掉最后一位的校验位,保留前12位数字。12位数字从左到右,奇数位乘1,偶数位乘3,然后求和,得到的和再对10进行整除,得到余数(即对11进行取模运算),再用10减去余数即为校验位,余数为0校验位即为0。13位ISBN校验位只有0-9。

例如,用13位ISBN9787111267768进行13位ISBN校验位的运算,去掉校验位8,其余的12位为978711126776。9*1+7*3+8*1+7*3+1*1+1*3+1*1+2*3+6*1+7*3+7*1+6*3,和为122122%102,10-28,即上述ISBN用13位ISBN表示应该为9787111267768

ISBN常见Python库

正常的话带连字符-的ISBN看起来很清晰,但是大家都懒嘛,现在各大网站基本上都没有连字符-,就13位数字,所以经常需要转换。

网上有很多Python版的ISBN处理代码,但是功能相对比较简单,比如上面提到的13位ISBN分段,实现起来就比较麻烦,所以尽量还是用现成的库吧。在PyPI上查了下,主流的有isbnid,isbnlib,isbntools

功能最简单的是isbnid,功能强大的有isbnlib和isbntools,isbntools使用isbnlib作为内核,加入了命令行工具,直接可以使用而不是编码。

isbnid

安装:

pip install isbnid

常见使用功能如下:

# 导入库,库名为isbn
import isbn

# 初始化对象,并检测ISBN有效性,如果输入的ISBN有问题会报错。默认为13位ISBN,输入10位ISBN会自动进行转换。
isbnid = isbn.ISBN("9787111267768")

# 10位ISBN转换
isbnid.isbn10()
#结果为'7111267761'

# 13位ISBN转换
isbnid.isbn13()
#结果为'9787111267768'

# URN转换
isbnid.urn()
#结果为'URN:ISBN:9787111267768'

# ISBN加连字符
isbnid.hyphen()
#结果为'978-7-111-26776-8'

# ISBN校验
isbnid.valid("'978-7-111-26776-8'")
#结果为True

isbnlib

安装:

pip install isbnlib

常见使用功能如下:

# 导入库,库名为isbnlib
import isbnlib

# 13位ISBN验证
isbnlib.is_isbn13("9787111267768")
#结果为True

# 10位ISBN验证
isbnlib.is_isbn10("7111267761")
#结果为True

# 10位ISBN转换为13位
isbnlib.to_isbn13("7111267761")
#结果为'9787111267768'

# 13位ISBN转换为10位
isbnlib.to_isbn10("9787111267768")
#结果为'7111267761'

# 生成纯数字的ISBN号,需要注意的是连字符错误也能正常生成。
isbnlib.canonical("978-7-111-26-7-76-8")
#结果为'9787111267768'

# ISBN加连字符
isbnlib.mask('9787111267768', separator='-')
#结果为'978-7-111-26776-8'

# 查询ISBN的语言或国家信息
isbnlib.info('9787111267768')
#"China, People's Republic"

#提取ISBN号
isbnlib.get_isbnlike('好吗天,ISBN:9787111267768你好', level='normal')
#结果为['9787111267768']

#清除非法字符
isbnlib.clean('好吗天,ISBN:9787111267768你好')
#结果为'ISBN9787111267768'

isbnlib还有很多其他强大的功能,不过大多只能用于谷歌或者美国的图书。

你可能感兴趣的:(代码片段)