我是python编程的新手。我正在尝试实现一个从文件中读取数据并以表格格式显示数据的代码。但是,当我尝试运行我的代码时,它给出的错误为:
TypeError: string indices must be integers
这是我的代码:
from operator import itemgetter
emp_dict = dict()
emp_list = list()
with open('m04_lab_profiles','r') as people:
for p in people:
emp_list = p.strip().split(',')
emp_info = dict()
emp_info['Name'] = emp_list[0]
emp_info['Location'] = emp_list[1]
emp_info['Status'] = emp_list[2]
emp_info['Employer'] = emp_list[3]
emp_info['Job'] = emp_list[4]
emp_dict[emp_list[0]] = emp_list
emp_list.append(emp_info)
for info in emp_list:
print("{0:20} {1:25} {2:20} {3:20} {4:45}".format(int(info['Name'],info['Location'],info['Status'],info['Employer'],info['Job'])))
print("\n\n")
info_sorted = sorted(emp_list,key=itemgetter('Name'))
for x in info_sorted:
print("{0:20} {1:25} {2:20} {3:20}
{4:45}".format(emp_info['Name'],
emp_info['Address'],
emp_info['Status'],
emp_info['Employer'],
emp_info['Job']))
对于相同的问题标题,我几乎尝试了所有其他解决方案,但所有方法都是徒劳的。请帮助
答案 0 :(得分:2)
问题是您在循环内外都使用emp_list
。结果是,加载文件后,列表中的某些元素为字符串(需要整数索引),某些元素为dict(具有更灵活的索引规则)。具体来说,用一个看起来像
name,location,status,employer,job
name2,location2,status2,employer2,job2
循环后,emp_list
看起来像
In [3]: emp_list
Out[3]:
['name2',
'location2',
'status2',
'employer2',
'job2',
{'Name': 'name2',
'Location': 'location2',
'Status': 'status2',
'Employer': 'employer2',
'Job': 'job2'}]
此问题的解决方法是使用其他临时列表作为.split(',')
调用的输出。即
In [4]: from operator import itemgetter
...: emp_dict = dict()
...: emp_list = list()
...: with open('m04_lab_profiles','r') as people:
...: for p in people:
...: tmp = p.strip().split(',')
...: emp_info = dict()
...: emp_info['Name'] = tmp[0]
...: emp_info['Location'] = tmp[1]
...: emp_info['Status'] = tmp[2]
...: emp_info['Employer'] = tmp[3]
...: emp_info['Job'] = tmp[4]
...: emp_dict[tmp[0]] = emp_info
...: emp_list.append(emp_info)
...:
...:
In [5]: emp_list
Out[5]:
[{'Name': 'name',
'Location': 'location',
'Status': 'status',
'Employer': 'employer',
'Job': 'job'},
{'Name': 'name2',
'Location': 'location2',
'Status': 'status2',
'Employer': 'employer2',
'Job': 'job2'}]