[英]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.