Python 从Csvfile排序OrderedDict

Python 从Csvfile排序OrderedDict,python,csv,Python,Csv,我一直在尝试对从csv文件中获取的OrderedDict进行排序,但它总是给我错误ValueError:I/O操作关闭的文件。我真的不知道我做错了什么,谷歌搜索没有给我答案 我的代码是: def exsort(filen): dic={} with open(filen) as excel: rdr = csv.reader(excel) next(excel) for cell in rdr: dic[cell[0]] = float(cell[1]),

我一直在尝试对从csv文件中获取的
OrderedDict
进行排序,但它总是给我错误
ValueError:I/O操作关闭的文件。
我真的不知道我做错了什么,谷歌搜索没有给我答案

我的代码是:

def exsort(filen):
dic={}
with open(filen) as excel:
    rdr = csv.reader(excel)
    next(excel)
    for cell in rdr:
        dic[cell[0]] = float(cell[1]), float(cell[2])
return OrderedDict(sorted(rdr, key=lambda x: x[0]))
csv文件的值为:

['Alison', '100', '0']
['Bart', '100', '5']
['Claris', '100', '10']
['Danny', '90', '0']
['Evelyn', '90', '5']

我基本上想打印一个按名称排序的
OrderedDict

您正试图调用
rdr
,该函数在
with
块的作用域之外,它会自动调用文件对象上的
exit
协议(包括与
file.close()
类似的内容)。显然,您无法处理关闭的文件,因此会出现错误

但是,您还应记住以下几点:

  • 只需将
    return
    移动到
    with
    块内部将不起作用,因为
    rdr
    是一个类似文件的对象,这意味着遍历它会将文件光标移动到末尾。我不确定是否执行类似
    excel.seek(0)
    (通常会将文件对象光标移回文件的开头)在这种情况下有效,因为您使用的是
    csv.reader

  • 无论如何,这是不必要的,因为您似乎可以执行类似于中的
    按键排序的示例


  • 您正试图使用
    块调用
    rdr
    ,该块会自动调用文件对象的所有必要退出协议。我刚刚尝试取消对return语句的缩进,它给了我以下命令:“OrderedDict()”这是因为您的
    rdr
    位于文件的末尾,您必须执行类似于
    excel.seek(0)的操作
    但由于您使用的是excel阅读器,我不确定是否允许这样做。我会改为在本链接中使用类似示例的方法谢谢您!我终于明白我做错了什么!但我似乎无法将您的答案标记为正确答案。请稍后将其作为答案发布