帮助实现功能!

我为大学入门编程课写了此功能.它用于验证ISBN是否有效.它通过检查数字的最后一个数字的计算校验和数字的最后数字来做到这一点.应该为整个TXT文件执行此操作.

选择 | 换行 | 行号
  1. def verify_isbn_file():
  2.     file_name = pick_a_file()
  3.     input_file = open(file_name)
  4.  
  5.     for line in input_file:
  6.         initial_multiplier = 10
  7.         check_sum = 0
  8.         raw_number = line.replace('-',' ')
  9.  
  10.         for character in raw_number[0:-2]:
  11.             if character != ' ':
  12.                 int_character = int(character)
  13.                 new_value = int_character*initial_multiplier
  14.                 check_sum += new_value
  15.                 initial_multiplier -= 1
  16.  
  17.         check_sum = check_sum%11
  18.         check_sum = 11-check_sum
  19.         check_sum = check_sum%11
  20.         check_sum = str(check_sum)
  21.  
  22.         if check_sum == '10':
  23.             check_sum = 'x'
  24.         if e[-1] != check_sum:
  25.             print line

唯一的事情是它不起作用.我已经检查了所有值,并知道嵌入式功能有效.此外,该算法也可以工作并返回与该行的最后一个数字相同的检查总和.因此,从本质上讲,我写的所有内容都可以工作.

选择 | 换行 | 行号
  1.         if e[-1] != check_sum:
  2.             print e

不幸的是,这部分是搞砸的. E [-1]出于某种原因将其引用到整个文件的最后一个元素,而不是循环的每一行.因此,仅根据检查和检查文件的最后一个数字.
我想知道的是,是否有人会告诉我是否有某种方法可以参考TXT文件中每行的最后一个字符,而是整个文件中的最后一个字符?
示例TXT文件包含有效的ISBN和无效的ISBN:

0-00-639498-1

0-00-639498-2

0-00-639498-3

0-13-117655-2

0-13-117655-3

0-13-117655-4

提前致谢!

# 回答1


好吧,如何回合:

选择 | 换行 | 行号
  1. if line[-1] != check_sum:
  2.     print line

我目前看不到您从哪里得到E.

# 回答2


我很抱歉!那是代码以前版本的残余.我已经纠正了e.但是不幸的是,这不是错误的根源:(
# 回答3


校验和通常由
或者
先前的结果"

选择 | 换行 | 行号
  1. >>> 8 ^ 4
  2. 12
  3. >>> 

对我来说,看起来像是算法问题.也许这会给您一些信息:

选择 | 换行 | 行号
  1. spudofile = [\
  2. '0-00-639498-1',
  3. '0-00-639498-2',
  4. '0-00-639498-3',
  5. '0-13-117655-2',
  6. '0-13-117655-3',
  7. '0-13-117655-4']
  8.  
  9.  
  10.  
  11. def verify_isbn_file():
  12. ##    file_name = pick_a_file()
  13. ##    input_file = open(file_name)
  14.  
  15.     for line in spudofile:
  16.         initial_multiplier = 10
  17.         check_sum = 0
  18.         raw_number = line[0:-2].replace('-',' ')
  19.         print raw_number
  20.  
  21.         for character in raw_number:
  22.             if character != ' ':
  23.                 int_character = int(character)
  24.                 new_value = int_character*initial_multiplier
  25.                 check_sum += new_value
  26.                 initial_multiplier -= 1
  27.  
  28.         print check_sum
  29.         check_sum = check_sum%11
  30.         print check_sum
  31.         check_sum = 11-check_sum
  32.         print check_sum
  33.         check_sum = check_sum%11
  34.         print check_sum
  35.         check_sum = str(check_sum)
  36.         print "________________"

0 00 639498
164
10
1
1
________________
0 00 639498
164
10
1
1
________________
0 00 639498
164
10
1
1
________________
0 13 117655
130
9
2
2
________________
0 13 117655
130
9
2
2
________________
0 13 117655
130
9
2
2
________________

# 回答4


尴尬!我的编程中有很多微小的缺陷,但我想这就是为什么我仍在学习的原因.再次,我通过制作RAW_NUMBER来纠正我的第一篇文章中的错误
但是我会说这不是问题.因为如果它正常工作,那么它不应为"打印行"打印任何数字,因为最后一个数字都不等于检查总和!
因此,由于某种原因,该行[-1]似乎仅指文件中的最后一个字符. :(
也许我还有其他错误.
谢谢您的帮助!非常感谢,我敢肯定您还记得成为初学者;)
我想到的一件事是想看看发生了什么:
在循环结束之前打印行[-1],以查看它是否是真正的值.它最终做的事情是打印什么都没有打印所有循环,直到最后的迭代,它打印了最后一个角色...
# 回答5


解决了!这是因为列表[-1]实际上是\ n,因为它要进入新行.
因此,我将List.Strip()[ - 1]放置了,生活变得更好10倍.
谢谢您的帮助(帮助我解决了一些错误 :d)

标签: python

添加新评论