如何将类结构应用于csv然后对其进行排序?

时间:2014-03-26 15:19:23

标签: python csv

我对一般的编码和Python非常环保,我正在尝试动态学习它,所以我为任何绿色错误提前道歉。我的目标是读取CSV文件并对数据进行排序。我认为使用课程是最好的,但我可能是错的。 CSV文件的格式如下。

A,1,2,3  
B,3,2,1  
C,2,1,3  
D,2,3,1  
E,1,3,2  
F,3,1,2 

每一行都是一个新项目,第一个字母是名称,数字是我想要对字母进行排序的数字。实际数据会有所不同,例如名称不仅仅是一个字母,但格式不会改变。我无法弄清楚如何应用我制作的课程并对其进行排序。到目前为止,这是我的代码:

class art:
    def __init__(self, name, c1, c2, c3):
    self.name = name
    self.c1 = c1
    self.c2 = c2
    self.c3 = c3

    def __repr__(self):
    return repr((self.name, self.c1, self.c2, self.c3))

data = open('c:/tempdata/test_sort_data.csv', 'r')
f = data.read()
print f

我打算使用像这样的排序函数:

sorted(f, key=lambda art: art.c1)

我只是使用print f检查并确保数据已正确读取。当我完成时,我只想打印排序列表。我最终想要使用多个参数运行更复杂的排序,所有三个数字,但我现在无法弄清楚如何对它进行排序。我不知道如何调用它,因为我不知道如何将数据格式化为班级。我也不坚持使用课程,这似乎是目前最干净的方式。任何帮助都会有所帮助。

2 个答案:

答案 0 :(得分:0)

要将每一行转换为Art实例(注意类名的大写约定),您可以这样做:

instances = []
with open('c:/tempdata/test_sort_data.csv') as data:
     for line in data:
         name, c1, c2, c3 = line.strip().split(",")
         c1, c2, c3 = map(int, (c1, c2, c3))
         instances.append(Art(name, c1, c2, c3))

在排序方面,您可以实施比较"魔术方法"在你班上:

class Art:
    ...
    def __eq__(self, other):
        return self.c1 == other.c1
    def __lt__(self, other):
        return self.c1 < other.c1

现在您可以使用sorted(instances)

答案 1 :(得分:0)

在这种情况下使用类只有在除了保存数据和对csv文件中的行进行排序之外还要做其他事情才有意义。例如,您可以在不使用类的情况下将数据排序为几行:

import csv
with open("data.csv", "r") as csv_file:
  data = [line for line in csv.reader(csv_file)]
data.sort(key=lambda entry: entry[1])

但是如果您需要一种更复杂的方式对条目进行排序,那么您可以在data.sort方法中定义要使用的特定函数,而不是使用lambda表达式。

如果你没有做任何事情而不是用数据排序,那么我会说你不需要经历定义一个类的“麻烦”。