Why am I getting ValueError: invalid literal for int() with base 10: ''

Why am I getting ValueError: invalid literal for int() with base 10: ''

当我 运行 这个程序时,我收到错误,ValueError: invalid literal for int() with base 10: '',我觉得这与 int 和 str 转换有关,但我'我真的不太确定,感谢任何帮助:)

CalendarDict = {1:"January", 2:"February", 3:"March", 4:"April", 5:"May", 
6:"June", 7:"July", 8:"August", 9:"September", 10:"October", 11:"Novemeber", 
12:"December"}

InputError = True
while InputError:
    try:
        BirthDate = str(input("Enter Birth Date in format DDMMYY - "))
    except ValueError:
        print("Error - Numbers in format DDMMYY only")
        InputError = False

DD = BirthDate[0:2] 
MM = BirthDate[3:4]
YY = BirthDate[4:6]

if MM == BirthDate[3:4]:
   print("Your Birth Month is - ", (CalendarDict[int(MM)]))

我宁愿把它放在评论中,但没有足够的代表,所以就这样吧。

首先,Python中的数组切片要求您以[a:b]格式给出数字,其中a是您要获取的第一个字符的索引,b是第一个字符的索引字符最多但 包括你想要得到你的字符,所以变量 MM 应该是 BirthDate[2:4].

接下来,要检查某些内容是否符合您的 "DDMMYY" 要求,您可能应该使用 int(input("Enter your DOB)),因为如果您使用 str() ,任何人都可以输入随机文本并侥幸逃脱将其转换为字符串的函数(因为我相信您正在寻找整数输入)

此外,如评论之一所述,请尝试将 InputError=False 放在 try 部分而不是 except 部分。

因此代码将如下所示:

CalendarDict = {1:"January", 2:"February", 3:"March", 4:"April", 5:"May", 
6:"June", 7:"July", 8:"August", 9:"September", 10:"October", 11:"Novemeber", 
12:"December"}

InputError = True
while InputError:
    try:
        BirthDate = int(input("Enter Birth Date in format DDMMYY - ")) # change to int() from str()
        InputError = False # set error to false since the above line got evaluated
    except ValueError:
        print("Error - Numbers in format DDMMYY only")

DD = BirthDate[0:2] 
MM = BirthDate[2:4]
YY = BirthDate[4:6]

print("Your Birth Month is - ", (CalendarDict[MM])) # converting into integer is not required since it already is one!  

正如其他人所指出的那样,让您感到困惑的是 slice notation。这是一个似乎可以满足您要求的版本:

CalendarDict = {1:"January", 2:"February", 3:"March", 4:"April", 5:"May", 
6:"June", 7:"July", 8:"August", 9:"September", 10:"October", 11:"Novemeber", 
12:"December"}

while True:
    try:
        BirthDate = str(input("Enter Birth Date in format DDMMYY - "))
        break
    except ValueError:
        print("Error - Numbers in format DDMMYY only")

DD = BirthDate[0:2] 
MM = BirthDate[2:4]
YY = BirthDate[4:]

print("Your Birth Month is - ", (CalendarDict[int(MM)]))

注意开始和结束位置是如何匹配的。

您可以使用 datetime 模块非常有效地完成您想要的工作。

import datetime

while True:
    try:
        birthDate = datetime.datetime.strptime(input("Enter Birth Date in format DD/MM/YYYY - "), "%d/%m/%Y")
        break
    except ValueError as ve:
        print(ve)
        continue

print("Your Birth Month is - {}".format(birthDate.strftime("%B")))

这导致使用:

Enter Birth Date in format DD/MM/YYYY - 31/10/2000
Your Birth Month is - October

datetime非常强大,尤其是提供的.strptime,用于解析日期,.strftime用于提供各种输出。如果您计划使用输入、输出和日期,我建议您阅读 documentationdatetime 很容易扩展到更复杂的日期任务。

如果您使用的是 Python2,请将 input 更改为 raw_input

我还删除了您的 if 声明 - 它似乎是在根据 MM 的定义检查 MM。请注意,CalendarDict 是不必要的,因为您可以使用 datetime 的强大功能。我已将您的 while 循环更改为仅使用控制流语句,而不是变量。

还有一个一般提示:对变量使用 camelCasingunderscore_casing,因为 CapitalCasing 通常保留给 类。