2015-04-08 2 views
0

У меня есть функция, созданная для проверки ISBN 10. Она работает достаточно хорошо, если вход от пользователя. Этого недостаточно, я хочу вводить текстовый файл и хранить вывод в текстовом файле.Чтение ввода из текстового файла и сохранение вывода

print("ISBN-Validation Program") 
    isbn = input("Enter isbn: ") 

    def stripDashes(isbn): 
     sisbn = isbn.replace("-", "").replace(" ", "").upper(); 

     return checkFormat(sisbn) 

    def checkFormat(isbn): 
     if len(isbn) == 10 and isbn[:9].isdigit()\ 
      and (isbn[-1] == "x" or isbn[-1] == "X" or isbn[-1].isdigit()): 
      return isValiDisbn(isbn) 
     else: 
      print("ISBN is not properly formatted.") 

    def isValiDisbn(isbn): 
     if (isbn[-1] == "x" or isbn[-1] == "X"): 
      total = int(isbn[0])*10 + int(isbn[1])*9 + int(isbn[2])*8\ 
       + int(isbn[3])*7 + int(isbn[4])*6 + int(isbn[5])*5\ 
       + int(isbn[6])*4 + int(isbn[7])*3 + int(isbn[8])*2 + 10 
     else: 
      total = int(isbn[0])*10 + int(isbn[1])*9 + int(isbn[2])*8\ 
       + int(isbn[3])*7 + int(isbn[4])*6 + int(isbn[5])*5\ 
       + int(isbn[6])*4 + int(isbn[7])*3 + int(isbn[8])*2 + int(isbn[9]) 

     if total % 11 == 0: 
      print("The number is valid.") 
     else: 
      print("The number is not valid.") 

    stripDashes(isbn) 

Вышеупомянутая функция работает для ввода пользователем, я думаю, что мой код для функции вызова и печать в текстовом файле где-то не так.

def main(): 
     inFile = open("isbn.txt", "r") 
     outFile = open("isbnOut.txt", "a") 

     for line in open("isbn.txt", "r"): 
      isbns = line.split() 
      for isbn in isbns: 
       if checkFormat(isbn) == False: 
        outFile.write(isbn.strip()+"\nISBN is not properly formatted.\n") 
       if isValiDisbn(isbn) == True: 
        outFile.write(isbn.strip()+"\nThe number is valid.\n") 
       if isValiDisbn(isbn) == False: 
        outFile.write(isbn.strip()+"\nThe number is not valid.\n") 

     inFile.close() 
     outFile.close() 

    def stripDashes(isbn): 
     sisbn = isbn.replace("-", "").replace(" ", "").upper(); 

     return checkFormat(sisbn) 

    def checkFormat(isbn): 
     if len(isbn) == 10 and isbn[:9].isdigit() and (isbn[-1] == "x" or isbn[-1] == "X" or isbn[-1].isdigit()) == True: 
      return isValiDisbn(isbn) 
     else: 
      return False 
      #print("ISBN is not properly formatted.") 

    def isValiDisbn(isbn): 
     if (isbn[-1] == "x" or isbn[-1] == "X"): 
      total = int(isbn[0])*10 + int(isbn[1])*9 + int(isbn[2])*8 + int(isbn[3])*7\ 
       + int(isbn[4])*6 + int(isbn[5])*5 + int(isbn[6])*4 + int(isbn[7])*3\ 
       + int(isbn[8])*2 + 10 
     else: 
      total = int(isbn[0])*10 + int(isbn[1])*9 + int(isbn[2])*8 + int(isbn[3])*7\ 
       + int(isbn[4])*6 + int(isbn[5])*5 + int(isbn[6])*4 + int(isbn[7])*3\ 
       + int(isbn[8])*2 + int(isbn[9]) 

     if total % 11 == 0: 
      return True 
      #print("The number is valid.") 
     else: 
      return False 
      #print("The number is not valid.") 

    main() 

Может ли кто-нибудь сказать мне, что здесь не так, и помочь мне пройти через это?

+0

Не уверен, если это связано с вашей проблемой, но вам не следует вызывать 'open (" isbn.txt "," r ")' дважды. – Kevin

ответ

0

Проблема заключается в том, что вы забыли назвать stripDashes, поэтому ISBN подается в int в виде 0-306-40615-2, а не как 0306406152

def stripDashes(isbn): 
    sisbn = isbn.replace("-", "").replace(" ", "").upper(); 

    return sisbn 

И как часть вашего цикла, сделайте следующее:

def main(): 
    inFile = open("isbn.txt", "r") 
    outFile = open("isbnOut.txt", "a") 

    for line in open("isbn.txt", "r"): 
     isbns = line.split() 
     for isbn in isbns: 
      stripped_isbn = stripDashes(isbn) 
      if checkFormat(stripped_isbn) == False: 
       outFile.write(isbn.strip()+"\nISBN is not properly formatted.\n") 
      if isValiDisbn(stripped_isbn) == True: 
       outFile.write(isbn.strip()+"\nThe number is valid.\n") 
      if isValiDisbn(stripped_isbn) == False: 
       outFile.write(isbn.strip()+"\nThe number is not valid.\n") 

Он отлично работает:

$ cat isbn.txt 
0-306-40615-2 
$ python isbn.py 
$ cat isbnOut.txt 
0306406152 
The number is valid. 

Другие вещи, чтобы отметить:

  • Вы открываете файл-как inFile = open("isbn.txt", "r"), но затем открыть его в петлю for line in open("isbn.txt", "r"):. Просто используйте свой открытый файл, например for line in inFile:, или удалите первую открывающую строку.
  • Ваш код, который записывает аут-файл, не работает.

    if checkFormat(isbn) == False: 
        outFile.write(isbn.strip()+"\nISBN is not properly formatted.\n") 
    if isValiDisbn(isbn) == True: 
        outFile.write(isbn.strip()+"\nThe number is valid.\n") 
    if isValiDisbn(isbn) == False: 
        outFile.write(isbn.strip()+"\nThe number is not valid.\n") 
    

    Если checkFormat возвращение False, он все равно будет проверять ISBN на достоверность, так что elif следует использовать для следующих линий. isValiDisbn(isbn) == False также не требуется, так как она вызывает isValiDisbn дважды, и сравнивает его с False (просто использовать not), так что просто использовать else:

    if checkFormat(isbn) == False: 
        outFile.write(isbn.strip()+"\nISBN is not properly formatted.\n") 
    elif isValiDisbn(isbn) == True: 
        outFile.write(isbn.strip()+"\nThe number is valid.\n") 
    else: 
        outFile.write(isbn.strip()+"\nThe number is not valid.\n") 
    
+0

Большое спасибо, это сработало. Но что я должен делать, если мне нужно, чтобы что-то вроде 0-471-58719-1 Число недопустимо. 14-A123490-3 ISBN неправильно отформатирован. 0-32-108599-X Число действительное. Я имею в виду тире как оригинал. прямо сейчас я получаю его без тире. – saroj

+0

@saroj Ах, хороший улов. Исправлено, см. Edit. – matsjoyce

+0

@saroj Если это работает, вы можете [принять] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) этот ответ, чтобы другие пользователи знали, что эта проблема имеет была решена. Благодаря! – matsjoyce

Смежные вопросы