繁体   English   中英

为什么会出现错误“跟踪(最近一次呼叫最近)”和“ TypeError:'_ io.TextIOWrapper'对象不可调用”错误

[英]Why do I get the errors “Traceback (most recent call last” and “TypeError: '_io.TextIOWrapper' object is not callable”

每当我运行代码时,都会收到以下错误消息:

从代码生成的异常

有人可以帮助我确定错误吗? 我为该语言表示歉意,但我的编程老师更喜欢接收我们的瑞典语脚本。

该程序的要点是,它允许警务人员在数据库(brottby.txt)中注册(启动)被盗汽车。 该人员还可以检查车牌是否已在数据库中注册(kontroll),注销车牌(avregistrering)并打印所有被盗汽车的完整列表(加锁)。

当我运行打印失窃车辆的完整列表的部分时出现错误(由“ while state_forteckning:”指定)。 我将文档中的每一行打印到控制台,但是此后编写的任何脚本都会遇到类似的异常。

# Importerar os och sys

import os
import sys

# Startlägen för while-loopar

state_pagaende = True
state_inmatning = False
state_kontroll = False
state_avregistrering = False
state_forteckning = False
state_avsluta = False

# Definierar korrekta värden för registreringsskyltar

bokstaver = "abcdefghjklmnoprstuwxyz"
tal = "0123456789"

# Skapa registerfil

try:
    f = open('brottby.txt', 'x')
except:
    pass

# Huvudloop (för omstart)

while state_pagaende:

    # Välkomstprompt

    print ("=======================================\n""POLISMYNDIGHETEN I BROTTBY: BILREGISTER\n""=======================================\n\n")

    # Alternativmeny

    alternativ = input("VÄLJ ETT ALTERNATIV [1-5]:\n\n""1.INMATNING\n""2.KONTROLL\n""3.AVREGISTRERING\n""4.FÖRTECKNING\n""5.AVSLUTA\n\n")
    print ("\n\n")

    # Bestämmer vilken alternativloop som ska startas

    if (alternativ == str(1)):
          state_inmatning = True
    elif (alternativ == str(2)):
          state_kontroll = True
    elif (alternativ == str(3)):
          state_avregistrering = True
    elif (alternativ == str(4)):
          state_forteckning = True
    elif (alternativ == str(5)):
          state_avsluta = True
    else:
          print ("OGILTIG INMATNING!\n\n")
          continue


    # Inmatning av ny stulen bil         

    while state_inmatning:

          print ("*INMATNING*\n\n")
          # Behandling av bokstäver i registreringsnumret

          registreringsbokstaver = input("MATA IN REGISTRERINGSNUMMRETS TRE FÖRSTA TECKEN [BOKSTÄVER]:\n\n")
          print ("\n")

          for tkn in registreringsbokstaver:

              if (tkn.lower() in bokstaver and len(registreringsbokstaver) == int(3)):

                  continue

              else:

                  print ("OGILTIG INMATNING!\n\n")
                  state_inmatning = False

          # Behandling av siffror i registreringsnumret

          registreringssiffror = input("MATA IN REGISTRERINGSNUMMRETS TRE SISTA TECKEN [SIFFROR]:\n\n")

          print ("\n")

          for tkn in registreringssiffror:

              if (tkn.lower() in tal and len(registreringssiffror) == int(3)):

                  continue

              else:

                  print ("OGILTIG INMATNING!\n\n")
                  state_inmatning = False

          # Definierar registreringsnumret

          registreringsnummer = registreringsbokstaver + registreringssiffror

          # Kontrollerar om registreringsnumret redan finns i registerfilen

          if registreringsnummer.upper() in open('brottby.txt').read():

              # Om registreringsnumret redan är registrerat

              print ("REGISTRERINGSNUMMER", registreringsnummer.upper(), "FINNS REDAN I DATABASEN!\n\n")

          else:

              # Om registreringsnumret inte är registrerat

              with open("brottby.txt", "a") as f:
                  f.write("\n" + registreringsnummer.upper())

              print ("REGISTRERINGSNUMMER", registreringsnummer.upper(), "ÄR TILLAGD I DATABASEN!\n\n")

          # Frågar användaren om hen vill avsluta programmet eller återgå till huvudmenyn

          fortsatt_inmatning = input("VILL DU MATA IN ETT TILL REGISTRERINGSNUMMER? [JA/NEJ]\n\n")
          print ("\n")

          # Fortsätt inmatning

          if (fortsatt_inmatning.upper() == "JA"):

              continue

          # Återgår till huvudmenyn

          elif (fortsatt_inmatning.upper() == "NEJ"):

              state_inmatning = False

          # Ogiltig inmatning

          else:
              print ("OGILTIG INMATNING!\n\n")

              state_inmatning = False


    # Kontroll av registreringsnummer gentemot databasen

    while state_kontroll:
        print ("*KONTROLL*\n\n")

        # Inmatning av registreringsnummer för sökning

        soktregistreringsnummer = input("VILKET REGISTRERINGSNUMMER VILL DU KONTROLLERA? [UTAN MELLANSLAG]\n\n")
        print ("\n")

        # Kontrollerar att registreringsnumret som ska kontrolleras har rätt längd

        # Om registreringsnumret har rätt längd

        if (len(soktregistreringsnummer) == int(6)):

            # Kontrollerar registreringsnummer gentemot databasen

            if (soktregistreringsnummer.upper() in open('brottby.txt').read()):

                print("FORDON", soktregistreringsnummer.upper(), "ÄR REGISTRERAD SOM STULEN I DATABASEN!\n")

            else:

                print("FORDON", soktregistreringsnummer.upper(), "ÄR INTE REGISTRERAD SOM STULEN I DATABASEN!\n")

        # Om registreringsnumret har fel längd

        else:
            print ("OGILTIG INMATNING!\n")
            state_kontroll = False


        # Frågar användaren om hen vill avsluta programmet eller återgå till huvudmenyn

        fortsatt_kontroll = input("VILL DU KONTROLLERA ETT TILL REGISTERINGSNUMMER? [JA/NEJ]\n\n")
        print ("\n")

        # Kontrollera ett till registreringsnummer

        if (fortsatt_kontroll.upper() == "JA"):

            pass

        # Återgår till huvudmenyn

        elif (fortsatt_kontroll.upper() == "NEJ"):
            state_kontroll = False

        # Ogiltig inmatning

        else:
            print ("OGILTIG INMATNING!\n\n")
            state_kontroll = False


    while state_avregistrering:
        print ("*AVREGISTRERING*\n\n")

        # Inmatning av registreringsnummer för avregistrering

        avregistrering = input("VILKET REGISTRERINGSNUMMER VILL DU AVREGISTRERA FRÅN DATABASEN? [UTAN MELLANSLAG]\n\n")
        print ("\n")

        # Kontrollerar att registreringsnumret har rätt längd

        # Om registreringsnumret har fel längd

        if (len(avregistrering) != int(6)):

            print ("OGILTIG INMATNING!\n")
            state_avregistrering = False

        # Om registreringsnumret har rätt längd

        else:

            # Kontrollerar om registreringsnumret finns i databasen

            # Om registreringsnumret inte finns i databasen

            if avregistrering.upper() not in open('brottby.txt').read():
                print ("REGISTRERINGSNUMMER", avregistrering, "FINNS INTE I DATABASEN!\n")
                state_avregistrering = False

            # Om registreringsnumret finns i databasen

            else:

                # För att ta bort ett registreringsnummer ur databasen, måste vi skriva över all information utom den vi vill ta bort till en ny databas                

                # Vi förbereder genom att döpa om den nuvarande databasen (den ska sen raderas)


                os.rename('brottby.txt', 'gammalbrottby.txt')

                # Skriver över all information från nuvarandra databas till ny, undantaget det avregistrerade registreringsnumret

                with open("gammalbrottby.txt", "r") as input:
                    with open("brottby.txt", "w") as output:

                        for line in input:

                            # Om registreringsnumret vi vill ta bort inte finns på en viss rad, skriv över den raden till den nya filen

                            if (avregistrering.upper() not in line):
                                output.write(line)

                            # Om registreringsnumret vi vill ta bort finns i en viss rad, skriv inte över den

                            else:
                                continue

                # Vi har nu skapat en ny databas, och raderar därför den gamla

                os.remove('gammalbrottby.txt')

                print ("FORDON", avregistrering, "ÄR NU AVREGISTRERAD FRÅN DATABASEN!")

        # Frågar användaren om hen vill avsluta programmet eller återgå till huvudmenyn

        fortsatt_kontroll = input("VILL DU AVREGISTRERA ETT TILL REGISTRERINGSNUMMER FRÅN DATABASEN? [JA/NEJ]\n\n")
        print ("\n")

        # Avregistrera ett till registreringsnummer

        if (fortsatt_kontroll.upper() == "JA"):
            pass

        # Återgår till huvudmenyn

        elif (fortsatt_kontroll.upper() == "NEJ"):

            state_kontroll = False

        # Ogiltig inmatning

        else:
            print ("OGILTIG INMATNING!\n\n")
            state_kontroll = False    


    # Printar förteckning av alla stulna bilar 

    while state_forteckning:
        print ("*FÖRTECKNING*\n\n")

        # För att förteckningen ska vara välformaterad, måste alla blankrader tas bort ur databasen

        # Vi döper om nuvarande databasen, som sedan ska raderas

        os.rename('brottby.txt', 'gammalbrottby.txt')

        # Kopierar gamla databasen rad för rad till en ny databas, undantaget om det är en blankrad

        with open("gammalbrottby.txt", "r") as input:
                with open("brottby.txt", "w") as output:
                    for line in input.readlines():
                        if not line.strip():
                            continue
                        else: 
                            output.write(line) 

        # Raderar gamla databasen

        os.remove('gammalbrottby.txt')

        # För att förteckningen ska vara välformaterad, måste det sista registreringsnumret i dokumentet följas av en nyrad

        with open("brottby.txt", "a") as f:
            f.write("\n")

        # Printar nu hela databasen, rad för rad, i bokstavsordning (sorted)

        forteckningslista = []

        with open("brottby.txt", "r") as f:
            for line in sorted(f):
                print (line)

        # Återgår till huvudmenyn

        print ("\n")

        state_forteckning = False



    # Avsluta programmet

    while state_avsluta:
        print ("*AVSLUTAR PROGRAMMET*\n\n")

        # Avslutar programmet

        sys.exit()

问题在于您正在重新定义或“遮盖”内置函数input的名称。 此示例重现该问题:

while True:
    foo = input('What? ')
    print('Foo is ', foo)
    with open('/dev/null', 'w') as input:  # <-- input is being redefined here!  
        pass

# run the code:

What? bar
Foo is  bar
Traceback (most recent call last):
     ...
    foo = input('What? ')
TypeError: '_io.TextIOWrapper' object is not callable

在循环的第一次迭代中,将调用内置input函数以获取用户输入,然后在with语句中将名称input重新分配给文件对象。 因此,现在input指向文件对象,即TextIOWrapper类的实例。

在循环的第二次迭代中,再次调用了input ,但是现在input是一个TextIOWrapper ,它不可调用,因此TypeError

您的代码中有问题的行是:

with open("gammalbrottby.txt", "r") as input:

将变量名input更改为其他名称,例如:

with open("gammalbrottby.txt", "r") as inputfile:
    with open("brottby.txt", "w") as output:
    for line in inputfile:
        ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM