isbn.py

どこかでだれかがつくっている可能性がありますが.... Pythonでisbn変換ツールつくってみました。

使い方

>>> import isbn
>>> isbn.to13(4873112885)
'9784873112886'
>>> isbn.to10('9784873112886')
'4873112885'
>>> 

ソースコード

import sys
import optparse

JPN = "978"

def to13(isbn):
  buf = str(isbn);  isbn = buf
  isbn = JPN + isbn
  return  checkdigit_isbn13(isbn)

def to10(isbn):
  buf = str(isbn);  isbn = buf[3:]
  return checkdigit_isbn10(isbn)

def checkdigit_isbn10(isbn):
  buf = str(isbn[:-1]);  isbn = buf
  j = 10;  digit = 0
  for i in isbn:
    digit += j * int(i)
    j -= 1
  digit = 11 - (digit % 11)
  if digit == 10: digit = "X"
  return isbn + str(digit)

def checkdigit_isbn13(isbn):
  buf = str(isbn[:-1]);  isbn = buf
  offset = (1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3)
  digit = 0;  j = 0
  for i in isbn:
    digit += int(i) * offset[j]
    j += 1
  digit = 10 - (digit % 10)
  return isbn + str(digit)

def checklength_isbn(isbn, chk):
  if len(isbn) != chk:
    print "invalid isbn-%d: %s" % (chk, isbn)
    return False
  return True


def main():
  parser = optparse.OptionParser()
  parser.add_option("-n", "--10to13", dest="isbn10", help="isbn-13")
  parser.add_option("-o", "--13to10", dest="isbn13", help="isbn-10")
  (options, args) = parser.parse_args()
  if options.isbn13:
    if not checklength_isbn(options.isbn13, 13): return -1
    isbn = options.isbn13[3:]
    isbn = checkdigit_isbn10(isbn)
  elif options.isbn10:
    if not checklength_isbn(options.isbn10, 10): return -1
    isbn = JPN + options.isbn10
    isbn = checkdigit_isbn13(isbn)
  else:
    if len(sys.argv) <= 1:
      print parser.print_help()
  if len(sys.argv) > 1:
    for i in sys.argv[1:]:
      if not checklength_isbn(i, 13): return -1
      isbn = i[3:]
      isbn = checkdigit_isbn10(isbn)
  print isbn

if __name__ == '__main__': main()