【问题标题】:Why am I getting ValueError: invalid literal for int() with base 10: ''为什么我收到 ValueError: invalid literal for int() with base 10: ''
【发布时间】:2018-02-01 07:01:42
【问题描述】:

当我运行这个程序时,我收到错误,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)]))

【问题讨论】:

  • 我什至不知道它是什么语言,但对我来说很明显MM 包含一些不能表示以 10 为底的整数的字符串。打印出来看看。
  • 哦,对不起,我忘了说,它的蟒蛇!
  • @Emily 您正在尝试使用int 将空字符串转换为数字。那显然行不通。您需要调试以找出您尝试执行此操作的位置。由于您只使用了一次int,因此应该很容易追踪到。
  • 知道在 Python 中对字符串或列表范围之外的切片会默默失败:"a"[3:4] == ""
  • 这是 Python 2 还是 3?我不太明白,这将彻底改变input 的行为。

标签: python valueerror


【解决方案1】:

您可以使用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 通常保留给类。

【讨论】:

    【解决方案2】:

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

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

    接下来,要检查某些内容是否符合您的“DDMMYY”要求,您可能应该使用int(input("Enter your DOB)),因为如果您使用 str() 函数将其转换为字符串(因为我相信你正在寻找积分输入)

    另外,如其中一个 cmets 所述,尝试将 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!  
    

    【讨论】:

    • 感谢您的帮助!我现在已经修好了,我的 inputerror = false 肯定放错地方了哈哈
    【解决方案3】:

    正如其他人所指出的那样,让您感到困惑的是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)]))
    

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

    【讨论】:

    • 我认为这会传递20 之类的输入,导致稍后失败,但从消息Numbers in format DDMMYY only 来看,您不会想到它会这样。不过,这实际上是 OP 代码中的问题,而不是您对 OP 问题的回答的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2021-12-25
    • 2022-01-09
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多