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()