如何将文本文件中的行号赋值给变量?

1 投票
3 回答
1466 浏览
提问于 2025-04-17 22:43

我想打印一个叫做'Number'的变量,但出现了一个错误。

错误信息是:'TypeError: list indices must be integers, not tuple'。

我不明白?什么是元组(tuple),我该怎么解决这个问题?我怎么把文本文件中的行号赋值给一个变量呢?

def CheckDatabase():
    print ("====Check Database===== \nA)Would you like to check details? \nB)Check if they are a member?")
    TC = input(": ")
    if TC == "A" or TC == "a":
        NameDetail = input ("Please enter the name you would like to check the details of.\nThis will only work if they are a member\n: ")
        with open('Name.txt') as ND:
            for number, line in enumerate(ND, 1):
                if (str(NameDetail)) in line:
                    Number = number, line in enumerate(ND, 1)
                    print ("\nName = ", NameDetail)

                    A = open("Address.txt", "r")
                    AData =[line.rstrip() for line in A.readlines()]
                    print ("Address = ",(AData[Number]))

                    HN = open("Home Number.txt", "r")
                    HNData =[line.rstrip() for line in HN.readlines()]
                    print ("Home Number = ",(HNData[Number]))

                    MN = open("Mobile Number.txt", "r")
                    MNData =[line.rstrip() for line in MN.readlines()]
                    print ("Mobile Number = ",(MNData[Number]))

                    EAS = open("Email Address.txt", "r")
                    EAData =[line.rstrip() for line in EAS.readlines()]
                    print ("Email Address = ",(EAData[Number]))

                    MDND = open("Email Address.txt", "r")
                    MDNData =[line.rstrip() for line in MDND.readlines()]
                    print ("Medical/Dietry Needs = ",(MDNData[Number]))


                else:
                    print ("Person not found!")

编辑:

import time

def AddToDatabase():
    print ("\nYou are adding to the Database. \nA)Continue \nB)Go Back")
    ATD = input(": ")
    if ATD == "A" or ATD == "a":

        Name = input("\nEnter Name of Member [First Name and Surname]: ")
        with open("Name.txt", "a") as N:
            N.write("\n{}".format(Name))
        time.sleep(1)
        print ("\nAdding...")
        time.sleep(1)

        print ("\nEnter Address of "+Name+" all on one line")
        print ("In format [Include Commas]")
        print ("\nRoad name with house number [e.g. 1 Morgan Way], Borough [e.g Harrow], City [e.g London], Postcode [e.g. HA5 2EF]")
        Address = input("\n: ")
        with open("Address.txt", "a") as A:
            A.write("\n{}".format(Address))
        time.sleep(1)
        print ("\nAdding...")
        time.sleep(1)

        Home_Number = input("\nEnter Home Number of "+Name+": ")
        with open("Home Number.txt", "a") as HN:
            HN.write("\n{}".format(Home_Number))
        time.sleep(1)
        print ("\nAdding...")
        time.sleep(1)

        Mobile_Number = input ("\nEnter Mobile Number of "+Name+": ")
        with open("Mobile Number.txt", "a") as MN:
            MN.write("\n{}".format(Mobile_Number))
        time.sleep(1)
        print ("\nAdding...")
        time.sleep(1)

        Email_Address = input ("\nEnter Email Address of "+Name+": ")
        with open("Email Address.txt", "a") as EA:
            EA.write("\n{}".format(Email_Address))
        time.sleep(1)
        print ("\nAdding...")
        time.sleep(1)

        Dietry_Needs = input("\nEnter Medical/Dietry Needs of "+Name+": ")
        with open("Medical Dietry Needs.txt", "a") as MDN:
            MDN.write("\n{}".format(Dietry_Needs))
        time.sleep(1)
        print ("\nAdding...")
        time.sleep(1)

        print ("All information for "+Name+" has been added. Redirecting Back To Main...")
        time.sleep(5)
        Main()

    elif ATD == "B" or ATD == "b":
        Main()

def CheckDatabase():
    print ("====Check Database===== \nA)Would you like to check details? \nB)Check if they are a member?")
    TC = input(": ")
    if TC == "A" or TC == "a":
        NameDetail = input ("Please enter the name you would like to check the details of.\nThis will only work if they are a member\n: ")
        with open('Name.txt') as ND:
            for number, line in enumerate(ND, 1):
                if (str(NameDetail)) in line:
                    Number, junk = number, line in enumerate(ND, 1)
                    print ("\nName = ", NameDetail)

                    A = open("Address.txt", "r")
                    AData =[line.rstrip() for line in A.readlines()]
                    print ("Address = ",(AData[number]))

                    HN = open("Home Number.txt", "r")
                    HNData =[line.rstrip() for line in HN.readlines()]
                    print ("Home Number = ",(HNData[Number]))

                    MN = open("Mobile Number.txt", "r")
                    MNData =[line.rstrip() for line in MN.readlines()]
                    print ("Mobile Number = ",(MNData[Number]))

                    EAS = open("Email Address.txt", "r")
                    EAData =[line.rstrip() for line in EAS.readlines()]
                    print ("Email Address = ",(EAData[Number]))

                    MDND = open("Email Address.txt", "r")
                    MDNData =[line.rstrip() for line in MDND.readlines()]
                    print ("Medical/Dietry Needs = ",(MDNData[Number]))


                else:
                    print ("Person not found!")

    elif TC == "B" or TC == "b":
        NameChoice = input("Enter persons name: ")
        with open('Name.txt') as NAME:
            for number, line in enumerate(NAME, 1):
                if (str(NameChoice)) in line:
                    print (NameChoice)
                    print ("is a member")
                else:
                    print ("Not a member!")


def Main():
    print ("\nSVA of UK Database")
    while True:
        print ("\nA)Check Database \nB)Add to Database \nC)Exit Program")
        choice = input(": ")

        if choice == "A" or choice == "a":
            CheckDatabase()

        elif choice == "B" or choice == "b":
            AddToDatabase()

        elif choice == "C" or choice == "c":
            break

        else:
            print ("Invalid Input")
            Main()

Main()

编辑 2: Name.txt :

Sagar Bharadia

Address.txt

8 John Road

Home Number.txt

02089563524

Mobile Number.txt

02045745854

Medical Dietry Needs.txt

None

编辑 3:

SVA of UK Database

A)Check Database 
B)Add to Database 
C)Exit Program
: A
====Check Database===== 
A)Would you like to check details? 
B)Check if they are a member?
: A
Please enter the name you would like to check the details of.
This will only work if they are a member
: Sagar Bharadia

Name =  Sagar Bharadia
1
Traceback (most recent call last):
  File "H:\SVA UK PROGRAM\SVA of UK.py", line 126, in <module>
    Main()
  File "H:\SVA UK PROGRAM\SVA of UK.py", line 114, in Main
    CheckDatabase()
  File "H:\SVA UK PROGRAM\SVA of UK.py", line 74, in CheckDatabase
    print ("Address = ",(AData[Number]))
IndexError: list index out of range
>>> 

3 个回答

0

在这一行:

Number = number, line in enumerate(ND, 1)

你给Number赋了两个值——这样会产生一个元组。

你可以这样做:

Number, junk = number, line in enumerate(ND, 1)

这样的话,Number就会变成一个单一的值,而不再是元组了。

0

元组是一种“列表”。你可以查看相关文档:

http://docs.python.org/release/1.5.1p1/tut/tuples.html

你可能是给变量 Number 赋了两个或更多的值。

2

你在写 Number = number, line in enumerate(ND, 1) 的时候,把 Number 定义成了一个元组。其实你在 for 循环里已经创建了 number, line in enumerate(ND, 1),那为什么不直接用这个呢?比如说 AData[number]

举个例子,这就是你实际上把 Number 设置成了什么:

>>> for x, y in enumerate([1,2,3], 1):
        print x, y in enumerate([1,2,3], 1)


1 False
2 False
3 False

它是一个元组,里面包含了你在 for 循环中得到的 numberline in enumerate(ND, 1) 的值(这是一个布尔表达式,要么在里面,要么不在里面)。

你还有几个其他的问题:

  • 你把 number1 开始,而不是从 0 开始,因为你给 enumerate 提供了 1。在 Python 中,列表的索引是从 0 开始的。所以如果列表的长度是 1,那么用 [1] 来索引其实是越界了。你应该用 enumerate(ND) 来从 0 开始。
  • 你需要在打开文件后用 .close() 来关闭它们,或者像你对第一个文件那样使用 with/as
  • 你打开了 Email Address.txt 两次……这是故意的吗?

撰写回答