CSV 文件函数如果为空,则返回 none,如果未找到文件,则返回错误

CSV file function should return none if empty, error if file not found

提问人:spaghettimafia 提问时间:11/17/2023 最后编辑:Paul Rooneyspaghettimafia 更新时间:11/17/2023 访问量:48

问:

我的代码应该读取 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
python csv 文件

评论

2赞 Macattack 11/17/2023
除了 None 之外,您的代码在哪里?return
1赞 Xukrao 11/17/2023
“但是,它不起作用。”请澄清。究竟发生了什么或没有发生什么?
0赞 John Gordon 11/17/2023
想必你是想回到stu_list......

答:

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

几点观察:

  1. 当学生列表不为空时,我看不到任何返回它的语句。这就是为什么你会得到.要修复它,请在 的地方 返回 .Noneprint(stu_list)stu_list
  2. 不要使用 bare ,这意味着没有任何特定错误。这种做法很危险,因为它会隐藏严重的错误,使调试变得极其困难。在这种情况下,我建议使用 。更好的是,我根本不会使用 try/except 并让调用者处理错误。exceptexceptFileNotFoundError
  3. 在计算平均值时,我使用而不是硬编码作为成绩数。statistics.mean10

法典:

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 自动生成的错误消息与打印消息一样具有信息性。