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
,和为197
,197%11
为10
,11-10
为1
,即上述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
,和为122
,122%10
为2
,10-2
为8
,即上述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
还有很多其他强大的功能,不过大多只能用于谷歌或者美国的图书。