我试图让它在.txt文件的每一行上运行。
D1 =int(lines[0])*10
D2 =int(lines[1])*9
D3 =int(lines[2])*8
D4 =int(lines[3])*7
D5 =int(lines[4])*6
D6 =int(lines[5])*5
D7 =int(lines[6])*4
D8 =int(lines[7])*3
D9 =int(lines[8])*2
D10=int(line[9])*1
Sum =(D1+D2+D3+D4+D5+D6+D7+D8+D9)
Mod = Sum % 11
D11= 11 - Mod
if D11 == 10:
D11 = 'X'
基本上,文本文件包含我需要通过在文本文件内的每个数字上运行此代码来验证的ISBN-10数字。这是定义行的位置,因为文本文件包含" - "在开始上面显示的过程之前,我需要删除它们。
filename = input("Enter the name of the .txt file: ")
file = open(filename, "r")
lines = file.read()
if "-" in lines:
lines = lines.replace("-", "")
lines = file.readline()
while lines:
D1 =int(lines[0])*10
D2 =int(lines[1])*9
D3 =int(lines[2])*8
D4 =int(lines[3])*7
D5 =int(lines[4])*6
D6 =int(lines[5])*5
D7 =int(lines[6])*4
D8 =int(lines[7])*3
D9 =int(lines[8])*2
D10=int(lines[9])*1
Sum =(D1+D2+D3+D4+D5+D6+D7+D8+D9)
Mod = Sum % 11
D11= 11 - Mod
if D11 == 10:
D11 = 'X'
if D10 == D11:
print("Your ISBN-10's are Valid!")
else:
print("Your ISBN-10's are invalid")
答案 0 :(得分:2)
您可以在阅读文件时即时进行处理。为了测试,我使用了一个名为isbn10.txt
的文件,其中包含这些组成的数字(在第一个之后,有效,其他所有后续数字都无效)。
0-201-53082-1
0-20A-53082-1
0-306-40615-2
0-307-40615-9
0-507-40615-X
这是执行此操作的代码。 ISBNs数字是基数11,可以是0-9或X,而不仅仅是基数10的0-9,因此在进行计算时必须注意这一点。另请注意,以下内容不会将数字保存在任何位置,因此需要将其添加到您希望保留它们的某些原因。它还会根据您在the subject上的维基百科文章中的信息进行与验证它们的代码不同的计算(请参阅标题为ISBN-10 check digits的部分)。还有关于如何在ISBN 10的维基百科文章Check digit部分中使用它的描述。
# Dictionary to map ['0'-'9', 'X', 'x'] to [0-9, 10, 10].
BASE10 = {digit: i for i, digit in enumerate('0123456789X')}
BASE10['x'] = BASE10['X'] # Allow upper and lowercase 'x's.
#filename = input("Enter the name of the .txt file: ")
filename = 'isbn10.txt' # Hardcoded for testing.
invalid_numbers_count = 0
with open(filename, "r") as file:
for numbers_count, line in enumerate(file, 1):
# Remove any leading or trailing whitespace and dashes from number.
digits = line.rstrip().replace('-', '')
try:
chksum = sum((i * BASE10[digit]) for i, digit in enumerate(digits, 1))
except KeyError: # Invalid digit.
chksum = 1 # Any non-multiple of 11.
if chksum % 11 == 0:
print('ISBN {} is valid'.format(line.strip()))
else:
print('ISBN {} is invalid'.format(line.strip()))
invalid_numbers_count += 1
print("{} of the {} ISBN-10's are invalid".format(
invalid_numbers_count if invalid_numbers_count else "None",
numbers_count))
输出:
ISBN 0-201-53082-1 is valid
ISBN 0-20A-53082-1 is invalid
ISBN 0-306-40615-2 is valid
ISBN 0-307-40615-9 is invalid
ISBN 0-507-40615-X is valid
2 of the 5 ISBN-10's are invalid
答案 1 :(得分:1)
您可以使用for
循环:
for i,line in enumerate(textFile):
#code to run on each line
其中,行是loop
中当前行的值,而i
是行号,所以让我们说你的文本文件是:
John
Doe
然后for
循环将是:
i as 0
line as John
在第一次运行时依此类推。
答案 2 :(得分:0)
您不必使用while
来迭代每行文件和每行数字
您必须使用for
循环enumerate()
内置函数,如下所示:
filename = input("Enter the name of the .txt file: ")
file = open(filename)
lines = file.readlines()
# # for testing
# lines = [
# '1-2345678-90\n', # invalid
# '18-619727-17\n' # valid
# ]
# iterate on lines
for line in lines:
SUM = 0
# remove '\n', new line, from line
line = line.strip()
# remove '-' from line
line = ''.join(digit for digit in line if digit != '-')
# iterate on line's digits
for i, digit in enumerate(line):
SUM += int(digit) * (len(line) - i)
Mod = SUM % 11
# print line for demonstration
print('ISBN-10: ', line)
# zero remainder = valid ISBN
if Mod == 0: # if not Mod:
print("Your ISBN-10's are Valid!")
else:
print("Your ISBN-10's are invalid")
将打印:
ISBN-10: 1234567890
Your ISBN-10's are invalid
ISBN-10: 1861972717
Your ISBN-10's are Valid!
答案 3 :(得分:-1)
让我们说:
with open("isbn_numbers.txt", "r") as fs:
lines = fs.readlines() # will give a list
您可以迭代lines
来计算总和,或者使用_sum = sum(map(int, lines))
假设您在txt文件中有数字。
不使用此处的变量,而是使用已有的列表,然后使用索引获取值。