Python 从Csvfile排序OrderedDict
我一直在尝试对从csv文件中获取的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]),
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阅读器,我不确定是否允许这样做。我会改为在本链接中使用类似示例的方法谢谢您!我终于明白我做错了什么!但我似乎无法将您的答案标记为正确答案。请稍后将其作为答案发布