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

来源:互联网 发布:淘宝网店盈利模式 编辑:程序博客网 时间:2024/05/22 03:19

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

常见使用功能如下:

# 导入库,库名为isbnimport 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

常见使用功能如下:

# 导入库,库名为isbnlibimport 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还有很多其他强大的功能,不过大多只能用于谷歌或者美国的图书。

阅读全文
1 0