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

2024-04-23 07:29:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我对一般的代码和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检查并确保数据被正确读取。当我完成时,我只想打印排序后的列表。我最终想使用多个参数,所有三个数字来运行一个更复杂的排序,但是我现在根本不知道如何对它进行排序,我不知道如何调用它,因为我不知道如何将我的数据格式化到类中。我也不坚决使用类,它只是目前看起来最干净的方式。任何帮助都会有帮助。你知道吗


Tags: 文件csv数据代码nameselfdata排序
2条回答

要将每一行转换为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)。你知道吗

在这种情况下,使用类只有在您不只是保存数据和对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表达式。你知道吗

如果您除了对数据进行排序之外什么都不做,那么我认为您不需要经历定义类的“麻烦”。你知道吗

相关问题 更多 >