免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3550 | 回复: 4
打印 上一主题 下一主题

我写的python版的isbn操作类 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-26 09:52 |只看该作者 |倒序浏览
  1. #coding=utf-8

  2. '''
  3. * isbn操作类
  4. * 版权所有
  5. * @author      t6760915<t6760915@gmail.com>
  6. * @version     $Id: isbn.py $
  7. '''

  8. class isbn:

  9.     #获取ISBN校验码
  10.     def getIsbnCode(self, isbn):

  11.         isbn = self.extractIsbn(isbn)

  12.         if not isbn:
  13.             return False

  14.         if len(isbn) == 10:
  15.             return self.getIsbn10Code(isbn)
  16.         elif len(isbn) == 13:
  17.             return self.getIsbn13Code(isbn)

  18.         return False

  19.     #计算10位ISBN的校验码
  20.     def getIsbn10Code(self, isbn):
  21.         
  22.         isbn = self.extractIsbn(isbn)
  23.         
  24.         if not isbn:
  25.             return False

  26.         if len(isbn) != 10:
  27.             return False

  28.         intList = list(isbn)

  29.         try:
  30.             zipList = zip([int(i) for i in intList[0:9]], range(10, 1, -1))
  31.         except:
  32.             return False

  33.         checksum = 11 - sum([i * j for i,j in zipList]) % 11

  34.         if checksum == 10:
  35.             return 'X'
  36.         elif checksum == 11:
  37.             return '0'

  38.         return str(checksum)

  39.     #计算13位ISBN的校验码
  40.     def getIsbn13Code(self, isbn):
  41.         
  42.         isbn = self.extractIsbn(isbn)

  43.         if not isbn:
  44.             return False

  45.         if len(isbn) != 13:
  46.             return False

  47.         intList = list(isbn)

  48.         try:
  49.             zipList = [(int(v[1]), self.getValueByIndex(v[0])) for v in enumerate(intList[0:12])]
  50.         except:
  51.             return False

  52.         checksum = 10 - sum([i * j for i,j in zipList]) % 10

  53.         if checksum == 10:
  54.             return '0'

  55.         return str(checksum)

  56.     #10位ISBN转13位ISBN
  57.     def isbn10to13(self, isbn):
  58.         
  59.         isbn = self.extractIsbn(isbn)

  60.         if not isbn:
  61.             return False

  62.         if len(isbn) != 10:
  63.             return False
  64.         
  65.         isbnList = list(str(isbn))
  66.         newIsbn = '978' + ''.join(isbnList[0:9]) + self.getIsbnCode('978' + isbn)

  67.         return newIsbn

  68.     #13位ISBN转10位ISBN
  69.     def isbn13to10(self, isbn):
  70.         
  71.         isbn = self.extractIsbn(isbn)

  72.         if not isbn:
  73.             return False

  74.         if len(isbn) != 13:
  75.             return False

  76.         isbnList = list(str(isbn))
  77.         newIsbn = ''.join(isbnList[3:12]) + self.getIsbnCode(''.join(isbnList[3:13]))

  78.         return newIsbn

  79.     #10位13位ISBN互转
  80.     def convertIsbn(self, isbn):

  81.         isbn = self.extractIsbn(isbn)

  82.         if not isbn:
  83.             return False

  84.         if len(isbn) == 10:
  85.             return self.isbn10to13(isbn)
  86.         elif len(isbn) == 13:
  87.             return self.isbn13to10(isbn)
  88.         
  89.         return False

  90.     #检查是否为有效的ISBN
  91.     def checkIsbn(self, isbn):

  92.         isbn = self.extractIsbn(isbn)

  93.         if not isbn:
  94.             return False

  95.         isbnList = list(str(isbn))
  96.         
  97.         if len(isbn) == 10 and isbnList[-1] == self.getIsbnCode(isbn):
  98.             return True
  99.         elif len(isbn) == 13 and isbnList[-1] == self.getIsbnCode(isbn):
  100.             return True
  101.         
  102.         return False

  103.     #获取字符串中由数字组成的子字符串
  104.     def extractIsbn(self, isbn):

  105.         isbnList = list(str(isbn).upper())
  106.         sourceList = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'X']

  107.         result = [i for i in isbnList if i in sourceList]

  108.         if not result:
  109.             return False

  110.         try:
  111.             result3 = ''.join(result[:3])
  112.         except:
  113.             result3 = ''
  114.         
  115.         #前缀把国家码改为:977(杂志),978,979,980
  116.         if result3 in ['977', '978', '979', '980'] and len(result) == 13:
  117.             return ''.join(result[0:13])
  118.         elif len(result) == 10:
  119.             return ''.join(result[0:10])
  120.         
  121.         return False

  122.     #计算13位校验码时使用的工具函数
  123.     def getValueByIndex(self, thisIndex):

  124.         if thisIndex % 2 == 0:
  125.             return 1
  126.         
  127.         return 3

  128. if __name__ == '__main__':
  129.     isbnList = ['7-81090-021-8', '978-7-5603-2733-4', '7-5600-3879-4', '978-7-81090-021-8', '7119027468']
  130.     isbnObj = isbn()

  131.     for isbn in isbnList:

  132.         #测试ISBN互转
  133.         newIsbn = isbnObj.convertIsbn(isbn)

  134.         #输出测试结果
  135.         print '%s => %s' % (isbn, newIsbn)
复制代码
isbn.rar (1.23 KB, 下载次数: 28)

论坛徽章:
0
2 [报告]
发表于 2010-05-28 13:37 |只看该作者
再加个issn的处理类,处理图书信息的时候能用上.
  1. #coding=utf-8

  2. '''
  3. * issn操作类
  4. * 版权所有
  5. * @author      xuxb<t6760915@gmail.com>
  6. * @version     $Id: issn.py $

  7. * ISSN校验码计算方法
  8. * 以ISSN 0317-8471为例,其校验码计算方法见下表
  9. * 1 取ISSN的前7位数字(校验位是第8位,即最后1位) 0 3 1 7 8 4 7
  10. * 2 取各位数字所对应的加权值(8-2) 8 7 6 5 4 3 2
  11. * 3 将各位数字与其相对应的加权值依次相乘 0 21 6 35 32 12 14
  12. * 4 将乘积相加,得出和数 0+21+6+35+32+12+14=120
  13. * 5 用和数除以模数11,得出余数 120÷11:10余10
  14. * 6 用模数减余数,所得差数即为校验码的值 11-10=1
  15. * 7 将所得校验码数值放在构成ISSN的基本数字的最右边 0317-8471
  16. * 如果差数为“10”,校验码则以大写英文字母“X”表示。如果余数是“0”,则校验码为“0”。
  17. '''

  18. class issn:

  19.     #获取ISSN校验码
  20.     def getIssnCode(self, issn):

  21.         issn = self.extractIssn(issn)

  22.         if not issn:
  23.             return False
  24.         
  25.         try:
  26.             issnZip = zip([int(i) for i in list(issn[0:7])], range(8, 1, -1))
  27.         except:
  28.             return False
  29.         
  30.         total = 0
  31.         for key,val in issnZip:
  32.             total += key * val
  33.         
  34.         lost = 11 - total % 11

  35.         if lost == 10:
  36.             lost = 'X'
  37.         
  38.         return lost
  39.    
  40.     #获取真正的issn,解决issn错误的问题
  41.     def getIssn(self, issn):
  42.         
  43.         issn = self.extractIssn(issn)
  44.         issnCode = self.getIssnCode(issn)

  45.         if not issnCode:
  46.             return False
  47.         
  48.         newIssn = ''.join(issn[0:7]) + str(issnCode)

  49.         return newIssn

  50.     #检查是否为有效的ISBN
  51.     def checkIssn(self, issn):

  52.         if not issn:
  53.             return False

  54.         xCode = self.getIssnCode(issn)

  55.         if xCode and xCode == list(issn)[-1]:
  56.             return True
  57.         
  58.         return False
  59.    
  60.     #获取字符串中由数字组成的子字符串
  61.     def extractIssn(self, issn):

  62.         issnList = list(str(issn).upper())
  63.         sourceList = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'X']

  64.         result = [i for i in issnList if i in sourceList]

  65.         if not result:
  66.             return False

  67.         return ''.join(result)

  68. if __name__ == '__main__':
  69.     issnList = ['0317-8471', '0001-5245', '0001-5334', '1008-4991', '1671-9999']
  70.     issnObj = issn()

  71.     for issn in issnList:

  72.         #获取校验码
  73.         newIssn = issnObj.getIssn(issn)

  74.         #输出测试结果
  75.         print '%s => %s' % (issn, newIssn)
复制代码
issn.rar (1.28 KB, 下载次数: 24)

论坛徽章:
0
3 [报告]
发表于 2010-05-28 15:05 |只看该作者
处要是对ISBN检验的么?

论坛徽章:
0
4 [报告]
发表于 2010-05-28 15:16 |只看该作者
处要是对ISBN检验的么?
bralf 发表于 2010-05-28 15:05



    对isbn检验,转换,析取,这都是我在处理图书信息的时候写的,因为我需要存储国际标准的13位isbn号

论坛徽章:
0
5 [报告]
发表于 2010-05-29 16:43 |只看该作者
不错不错 支持一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP