我的问题是,是否有人可以帮我调试这段代码:
import datetime
print ("What is your date of birth? ")
dateofbirth = input("Please type your date of birth in a YYYY-MM-DD format ")
year, month, day = map(int, dateofbirth.split('-'))
dateofbirth1 = datetime.date(year, month, day)
today = datetime.date.today()
open('dateutil.tar').read()
from dateutil.relativedelta import relativedelta
difference_in_years = relativedelta(today, dateofbirth1).years
if difference_in_years < 18
print ("Sorry, you are not eligible to vote.")
else
print ("You are over 18 and thus eligible to vote.")
我的目标是尝试编写一段代码,如果某人超过18岁并因此有资格投票,那么该代码可以解决。这是通过要求此人输入他们的出生日期,然后计算他们的出生日期和今天的日期之间的差异,然后使用IF声明告诉他们他们是否能够投票(即如果年份的差异大于或小于18)。
目前我在调试此代码时遇到了一些问题。首先,在第10行有一个语法错误,我不确定如何纠正。其次,如果我删除最后4行并再次运行代码,我会收到以下错误:
Traceback (most recent call last):
File "C:\removed\canyouvote.py", line 8, in <module>
open('dateutil.tar').read()
File "C:\Program Files (x86)\Python\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 5: character maps to <undefined>
然而,很可能还有其他错误,我目前无法接受。可悲的是,由于我对编程很陌生,我的知识和经验都不是很好,所以任何帮助都会非常感激!在尝试研究解决方案时,我试图使用我不熟悉的编码,所以请在我错的地方纠正我。
非常感谢你!
答案 0 :(得分:1)
您获得UnicodeDecodeError
的原因是您尝试打开并阅读tarball - 即二进制文件 - 就像它是文本文件一样。
当你这样做时,Python会尝试解释该文件的任意字节,就像它们代表默认字符集(cp1252)中的字符一样,但如果你这样做,那将会给你一个例外。幸运的是,如果你没有成功地给你完全垃圾。尝试在文本编辑器中打开dateutil.tar
,看看它有多么有意义。
很难说如何解决这个问题,因为我们不清楚你为什么要首先尝试打开并阅读该文件。正如jonrsharpe指出的那样,您对结果没有做任何事情。我无法想象你会做什么。
如果你试图使dateutil
可导入,那么这样做的方法是不要对脚本中的tarball做任何事情,而是安装模块,你可以从脚本外部执行,在运行它之前。最简单的方法就是pip install dateutil
,它会自动找到dateutil
的正确版本,下载它,解压缩并安装它以供所有脚本使用。
话虽如此,这里dateutil
真的没有必要。如果您只是减去两个datetime
个对象,则会得到timedelta
个对象。
同时,SyntaxError
来自此代码:
if difference_in_years < 18
print ("Sorry, you are not elegible to vote.")
else
print ("You are over 18 and thus elegible to vote.")
在Python中,像if
和else
这样的复合语句在套件之前需要冒号,并且套件必须缩进。请参阅教程的First Steps Towards Programming部分。所以:
if difference_in_years < 18:
print("Sorry, you are not eligible to vote.")
else:
print("You are over 18 and thus eligible to vote.")
(另请注意,我已删除括号前的空格,以符合PEP 8样式,并且符合条件且符合条件的#34;正确。)
答案 1 :(得分:0)
您可以在没有dateutils模块的情况下计算某人可能出生的最新日期。所以你甚至不需要解压缩tarball或者真的担心额外的代码。这是一个计算出生日期必须为18岁的日期的简单例子。
import datetime
now = datetime.datetime.today() # Get a datetime object for today
days = (365 * 18) + (18 / 4) # calculate days to go back along with leap years
back18 = now - datetime.timedelta(days=days) # create another datetime object that represents the date the user needs to be to be 18.
然后,当您从输入中创建日期时间对象时,您可以只比较它们。
if birthdate >= back18:
do stuff