如何在每行txt文件上运行一些东西?

时间:2017-11-26 19:13:38

标签: python

我试图让它在.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")

4 个答案:

答案 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文件中有数字。

  

不使用此处的变量,而是使用已有的列表,然后使用索引获取值。