with open('成绩.txt', 'r') as f: student_list = [] f.readline() for line in f.readlines(): line = line.replace("\n", '') a = line.split(',') student_dict = { '学号': a[0], '姓名': a[1], '语文': float(a[2]), '数学': float(a[3]), '英语': float(a[4]) } student_dict['总分'] = student_dict['语文'] + student_dict['数学'] + student_dict['英语'] student_list.append(student_dict) student_list = sorted(student_list, key=lambda x: x['总分'], reverse=True) print('学号 姓名 总分') for i, student in enumerate(student_list): print("{} {} {}".format(student['学号'], student['姓名'], student['总分']))
时间: 2024-01-25 21:03:10 浏览: 28
这段代码是读取一个文本文件"成绩.txt",文件中每一行代表一个学生的成绩信息,包括学号、姓名、语文成绩、数学成绩和英语成绩。代码将每个学生的信息存储在一个字典中,并将所有学生的字典存储在一个列表中。列表中的每个学生字典包括学号、姓名、语文成绩、数学成绩、英语成绩和总分。总分是语文、数学和英语成绩的总和。
代码将列表按照学生总分从高到低排序,并打印排名信息,包括学号、姓名和总分。最后输出的结果类似于:
学号 姓名 总分
1001 张三 290.0
1002 李四 285.5
1003 王五 280.0
...
相关问题
帮我优化一下这段python代码 import datetime class error: def __init__(self, log_path): pass self.log_path = log_path self.port = port self.end_time = end_time self.start_time = start_time def network_error(self, log_path: str, port: str, end_time: float, start_time: float = 0): with open(log_path, 'r') as f: for line in f.readlines(): log_time_str = line.split()[0] # 就看第一个是不是时间,如何是是时间戳的话看下要不要转 datetime_object = datetime.datetime.strptime( log_time_str, '%Y-%m-%d %H:%M:%S') log_time = datetime_object.timestamp() if start_time <= log_time <= end_time: if port in line: return True def no_finf_element(self, log_path: str, end_time: float, start_time: float = 0): with open(log_path, 'r') as f: for line in f.readlines(): log_time_str = line.split()[0] # 就看第一个是不是时间,如何是是时间戳的话看下要不要转 datetime_object = datetime.datetime.strptime( log_time_str, '%Y-%m-%d %H:%M:%S') log_time = datetime_object.timestamp() if start_time <= log_time <= end_time: if 'no such element' in line: return True def error_judge(self): if network_error(self.log_path, self.port, self.end_time, self.start_time) == True and no_finf_elemen(self.log_path, self.end_time, self.start_time) == True: pass # 不执行重跑 else: pass # 执行重跑
以下是对代码的优化建议:
1. class error 中的 __init__ 方法中有一个无用的 pass,可以删除。
2. class error 中的 network_error 和 no_finf_element 方法中有相同的代码,可以将重复代码提取出来,写成一个私有方法,然后在这两个方法中调用。
3. network_error 和 no_finf_element 方法中的循环读取文件的方式不够高效,可以使用 readline() 方法替换 readlines() 方法,每次只读取一行,这样可以减少内存占用。
4. network_error 和 no_finf_element 方法中可以使用 with open(log_path, 'r') as f: 的方式打开文件,这样可以自动关闭文件,避免忘记关闭导致的资源泄漏。
5. 在 error_judge 方法中,if network_error(...) == True 可以简写成 if network_error(...):
6. 在 error_judge 方法中,if no_finf_elemen(...) == True 应该是 if no_finf_element(...) == True:
下面是优化后的代码:
```python
import datetime
class error:
def __init__(self, log_path, port, end_time, start_time=0):
self.log_path = log_path
self.port = port
self.end_time = end_time
self.start_time = start_time
def _check_error(self, log_path, end_time, start_time, error_str):
with open(log_path, 'r') as f:
line = f.readline()
while line:
log_time_str = line.split()[0]
datetime_object = datetime.datetime.strptime(log_time_str, '%Y-%m-%d %H:%M:%S')
log_time = datetime_object.timestamp()
if start_time <= log_time <= end_time:
if error_str in line:
return True
line = f.readline()
return False
def network_error(self):
return self._check_error(self.log_path, self.end_time, self.start_time, self.port)
def no_finf_element(self):
return self._check_error(self.log_path, self.end_time, self.start_time, 'no such element')
def error_judge(self):
if self.network_error() and self.no_finf_element():
pass # 不执行重跑
else:
pass # 执行重跑
```
这个代码哪里错了吗 def Read_from_file(self,path): file_name = 'log_file.txt' with open(file_name,'r') as file_obj: while True: line = file_obj.readline() if line == '': break print(line) def Get_User_log(self,path): uid = input('请输入用户id') temp_lst= [] file_name = os.path.join(path,'log_file.txt') count = 0 with open(file_name,'r') as file_obj: while True: line = file_obj.readline() if line == '': break temp_lst = line.split('\t') if temp_lst[0]==uid: print(line) count += 1 if count ==0: print('没有该用户') end
这段代码可能存在以下问题:
1. 在函数 `Read_from_file` 中,`file_name` 变量的值应该为 `path` 参数,而不是固定为 `'log_file.txt'`。
2. 在函数 `Get_User_log` 中,应该将用户输入的 `uid` 转换为字符串类型,以便与读取到的日志文件中的用户id进行比较。可以使用 `str()` 函数将其转换为字符串类型。
3. 在函数 `Get_User_log` 中,最后的 `end` 变量没有定义,可能是多余的。
下面是修改后的代码:
```
def Read_from_file(self, path):
with open(path, 'r') as file_obj:
while True:
line = file_obj.readline()
if line == '':
break
print(line)
def Get_User_log(self, path):
uid = str(input('请输入用户id:'))
temp_lst = []
count = 0
with open(path, 'r') as file_obj:
while True:
line = file_obj.readline()
if line == '':
break
temp_lst = line.split('\t')
if temp_lst[0] == uid:
print(line)
count += 1
if count == 0:
print('没有该用户')
```
希望能对你有所帮助!