文本文件处理,数据准备,日期时间格式,列表内列表python程序问题在世总统的独特问题



问题如下:

唐纳德·约翰·特朗普(生于1946年6月14日(就任第45任 2017年1月20日,美国总统。从那天起, 五位前美国总统同时还活着。在 美国历史上只有四个时期 情况是这样的:

1861 年 3 月 4 日 - 1862 年 1 月 18 日:马丁·范布伦、约翰·泰勒、 米勒德·菲尔莫尔、富兰克林·皮尔斯、詹姆斯·布坎南

1993年1月20日至1994年4月22日:理查德·尼克松、杰拉尔德·福特、吉米 卡特、罗纳德·里根、乔治·

2001年1月20日-2004年6月5日:杰拉尔德·福特、吉米·卡特、罗纳德 里根、乔治·H·W·布什、比尔·克林顿

2017年1月20日至2018年11月30日:吉米·卡特、乔治·H·W·布什、 比尔·克林顿、乔治·W·布什、巴拉克·奥巴马

赫伯特·胡佛又活了11,553天(31岁零230天( 离职。詹姆斯·波尔克在三个月(103天(后去世 离开他的总统职位。在当选美国总统的个人中, 八人从未获得"前总统"的地位,因为他们 死于任上:威廉·H·哈里森(肺炎(,扎卡里·泰勒 (胆汁性腹泻(、亚伯拉罕·林肯(遇刺(、詹姆斯· (遇刺(、威廉·麦金莱(遇刺(、沃伦· (心脏病发作(、富兰克林·罗斯福(脑溢血(和约翰· 肯尼迪(遇刺身亡(。

在这个问题中,我们将处理包含信息的文本文件 关于特定国家元首的寿命和任期。每 行包含五个制表符分隔的信息字段:i( 负责人姓名 州,ii(出生日期,iii((第一个(学期开始日期,iv((最后一个( 任期结束日期和 v( 死亡日期。四个日期字段在 格式 dd/mm/yyyy,每个片段都是自然数,没有 前导零:dd 表示日期,mm 表示月份,yyyy 表示年份。 以下链接显示了包含以下内容的 tecxt 文件的内容 有关美国最近十位总统的信息。

[1]: https://medusa.ugent.be/en/activities/58851522/description/kwhRYw8usry-8zoF/media/us_presidents.txt

如果国家元首连任多个非连续任期,我们 假设他只连续任职一个任期 从第一个学期的开始日期开始到结束日期 上个学期。如果国家元首今天仍在任职,结束 他的任期日期由空字符串表示。万一头部 状态今天仍然活着,死亡日期由 空字符串。

我需要编写一个函数headsOfState,该函数获取文本文件的位置,其中包含有关特定国家元首的寿命和任期的信息。该函数必须返回一个字典,该字典将文件中所有国家元首的名称映射到一个元组上,其中包含文件中提到的四个事件的日期(datetime.date 对象(,其出现顺序与文件中的顺序相同。尚未发生的事件的日期必须用值None表示。

下面是我的代码:

from datetime import date
def headsOfState(filepath_of_workdir):
open_file = open(filepath_of_workdir, 'r', encoding='utf-8')
'''accessesing the text file from working directory. here we are 
creating a list of lists of all words line wise using (readlines)'''
content = open_file.readlines()    
open_file.close()   
content_list  = []  
for i in range(len(content)):
content_list.append(content[i].split('t')) 
prez_list = []
for i in range(len(content_list)):
prez_list.append(content_list[i][0])
del (content_list[i][0])
#print(prez_list)
#print(content_list)
temp_date = None
inter_date_list = []    
final_date_list = []
for i in range(len(content_list)):
temp_date = (content_list[i])      
for j in range(len(temp_date)):
item1 = temp_date[j].strip()
item2 = item1.split('/')               
if item2 == '' or item2 == ['n']:
inter_date_list.append(None)
else:
year = int(item2[2])
month = int(item2[1])
day = int(item2[0])
inter_date_list.append(date(year, month, day))
if len(inter_date_list) == len(content_list[i]):
final_date_list.append(inter_date_list)
temp_date = None
inter_date_list = []
dict_prez = dict(zip(prez_list, final_list)) 
return dict_prez

我收到以下错误:

headsOfState('us_presidents.txt')
Traceback (most recent call last):
File "<ipython-input-66-1730ba5bcf8b>", line 1, in <module>
headsOfState('us_presidents.txt')
File "<ipython-input-65-1fbaf479e49a>", line 28, in headsOfState
year = int(item2[2])
IndexError: list index out of range

输出应如下所示:

>>> events = headsOfState('us_presidents.txt')
>>> events['George Washington']
(datetime.date(1732, 2, 22), datetime.date(1789, 4, 30), datetime.date(1797, 3, 4), datetime.date(1799, 12, 14))
>>> events['Barack Obama']
(datetime.date(1961, 8, 4), datetime.date(2009, 1, 20), datetime.date(2017, 1, 20), None)
>>> events['Donald Trump']
(datetime.date(1946, 6, 14), datetime.date(2017, 1, 20), None, None)

请帮助我解决错误或提出更好的策略。

谢谢@mkrieger1。下面是我的最终代码。它有效。

from datetime import date
def headsOfState(filepath_of_workdir):
open_file = open(filepath_of_workdir, 'r', encoding='utf-8')
'''accessesing the text file from working directory. here we are 
creating a list of lists of all words line wise using (readlines)'''
content = open_file.readlines()    
open_file.close()
'''creating an empty list for splitting the data at position with (t)'''
content_list  = []  
'''adding the splitted data to the list'''
for i in range(len(content)):
content_list.append(content[i].split('t')) 
'''creating an empty list to add all president names to it and deleting the names
from content_list'''
prez_list = []
for i in range(len(content_list)):
prez_list.append(content_list[i][0])
del (content_list[i][0])
'''creating an interim empty date list for date manipuation and empty final date list
for final tuple of dates in w.r.t. president names in prez_list'''
inter_date_list = []    
final_date_list = []
for i in range(len(content_list)):
temp_date = content_list[i]
for j in range(len(temp_date)):
item1 = temp_date[j].strip()
item2 = item1.split('/') 
'''creating integer for year, month and day for datetime format'''
if len(item2) >1:
year = int(item2[2])
month = int(item2[1])
day = int(item2[0])
inter_date_list.append(date(year, month, day))
while len(inter_date_list) <= 3: 
inter_date_list.append(None)
'''adding the dates for respective presidents to final list as tuple'''
final_date_list.append(tuple(inter_date_list))
'''emptying the inter_date_list for next list of dates from content_list'''
inter_date_list = [] 
'''creating the dictionary with keys as president names and values as date tuples'''
dict_prez = dict(zip(prez_list, final_date_list))
return dict_prez

最新更新