提问人:spaghettimafia 提问时间:11/17/2023 最后编辑:Paul Rooneyspaghettimafia 更新时间:11/17/2023 访问量:48
CSV 文件函数如果为空,则返回 none,如果未找到文件,则返回错误
CSV file function should return none if empty, error if file not found
问:
我的代码应该读取 csv 文件并以字典列表的形式返回信息。但是,它不起作用。
import csv
def read_csv(fname):
stu_list = []
try:
with open(fname, 'r') as students:
reader = (csv.reader(students))
for row in reader:
avg = sum(float(grade) for grade in row[2:]) / 10
rounded_avg = round(avg, 3)
student_info = {'name': row[0], 'section':row[1], 'scores':[grade for grade in row[2:]], 'average':rounded_avg}
stu_list.append(student_info)
if len(stu_list) == 0:
return None
print(stu_list)
except:
print(f"Error occurred when opening {fname} to read")
return None
答:
2赞
Paul Rooney
11/17/2023
#1
基本上你需要做的就是返回。所以将stu_list
print(stu_list)
跟
return stu_list
并将打印件放在呼叫站点。类似的东西
print(read_csv('students.csv'))
就我个人而言,我认为这些东西有点不蟒蛇,因为它打断了快乐路径的流动(没有错误)。我会允许异常传播给用户,让他们决定如何处理它们。return None
一些更新的代码
import csv
def read_csv(fname):
stu_list = []
with open(fname, 'r') as students:
for row in csv.reader(students):
name, section, *scores = row
avg = sum(float(grade) for grade in scores) / len(scores)
student_info = {'name': name, 'section': section, 'scores': scores, 'average': round(avg, 3)}
stu_list.append(student_info)
return stu_list
if __name__ =='__main__':
from sys import argv, exit
if len(argv) < 2:
print('must provide file name')
exit(1)
filename = argv[1]
try:
values = read_csv(filename)
if values:
print(values)
else:
print(f"Error student list {filename} is empty")
except:
print(f"Error occurred when opening {filename} to read")
评论
1赞
spaghettimafia
11/17/2023
谢谢!我是一个初学者程序员,这很有帮助。
1赞
Hai Vu
11/17/2023
#2
几点观察:
- 当学生列表不为空时,我看不到任何返回它的语句。这就是为什么你会得到.要修复它,请在 的地方 返回 .
None
print(stu_list)
stu_list
- 不要使用 bare ,这意味着没有任何特定错误。这种做法很危险,因为它会隐藏严重的错误,使调试变得极其困难。在这种情况下,我建议使用 。更好的是,我根本不会使用 try/except 并让调用者处理错误。
except
except
FileNotFoundError
- 在计算平均值时,我使用而不是硬编码作为成绩数。
statistics.mean
10
法典:
import csv
import statistics
def read_csv(fname):
stu_list = []
try:
with open(fname, "r") as students:
reader = csv.reader(students)
for row in reader:
scores = [float(grade) for grade in row[2:]]
avg = statistics.mean(scores)
rounded_avg = round(avg, 3)
student_info = {
"name": row[0],
"section": row[1],
"scores": scores,
"average": rounded_avg,
}
stu_list.append(student_info)
if len(stu_list) == 0:
return None
return stu_list
except FileNotFoundError:
print(f"Error occurred when opening {fname} to read")
return None
评论
0赞
Xukrao
11/17/2023
我同意第2项建议。这里没有真正的理由使用 try/except 子句。从 FileNotFoundError 自动生成的错误消息与打印消息一样具有信息性。
评论
return