2014-10-29 55 views
0

我的问题是,如果任何人都可以请帮我调试这段代码:如何使用Python找到两个日期之间的差异? (打,如果一个人是18岁以上)

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> 

然而在所有的可能性也有,我目前无法拿起对方失误。遗憾的是,由于我对编程非常陌生,我的知识和经验并不是很好,所以任何帮助都将不胜感激!在试图研究解决方案时,我试图使用我不熟悉的编码,所以请纠正我错误的地方。

非常感谢您提前!

+1

嘛'SyntaxError'是因为[语法是错误的(https://docs.python.org/3/tutorial/controlflow.html#if-statements)和什么是你想怎么办与文件?你没有把内容分配给任何东西,那一行的重点是什么? – jonrsharpe 2014-10-29 00:40:44

+0

在Python中,像'if'和'else'这样的复合语句在套件之前需要冒号,套件必须缩进。请参阅本教程的[编程的第一步](https://docs.python.org/3/tutorial/introduction.html#first-steps-towards-programming)部分。 – abarnert 2014-10-29 00:42:31

+1

另外,你为什么在这里使用'dateutil'?你有没有尝试打印出你从'today - dateofbirth1'得到的东西是否有用? (如果你还没有习惯于在交互式解释器中输入东西,在你的代码中使用'print'调用,或者使用调试器,你至少需要学习一个,最后是三个,即使是最微不足道的方案也能成功写出来。) – abarnert 2014-10-29 00:43:56

回答

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,像ifelse复合语句需要套件之前冒号和套件必须被缩进。请参阅教程的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风格,拼写为“合格”正确。)

+0

我很抱歉,正如我前面提到的,我几乎没有这方面的经验,而且您的输入非常有帮助。压缩包的原因很简单,就是我试图解决这个问题变得困惑,并试图用我发现的其他相关问题的答案拼凑出一个新的代码(显然这不起作用)。我也纠正了拼写错误,这是我的疏忽。谢谢您的回答。 – Kaedra 2014-10-29 19:11:49

0

可以计算出最新的日期,有人可能没有dateutils模块就出生18岁。所以你甚至不需要解压tarball或者真的担心额外的代码。下面是计算的日期的一个简单的例子,一个人必须在创建从它们的输入DateTime对象出生的是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 
+0

谢谢,这真的很有帮助,我现在设法修复它。 – Kaedra 2014-10-29 19:05:03

相关问题