我有一个名为"CleanReport.csv“的csv文件,其中包含一些示例数据,如下所示:
Name,Color,Age
Mark,Red,9999
Bob,Red,712
Alice,Green,1
Lisa,Pink,99
Jacob,Yellow,33
Corey,Orange,44使用Python,我试图按列“Age”(在索引2处)进行排序,而不松开头列在开头的位置。这是我的代码:
import csv
import operator
with open('CleanReport.csv', 'r') as sortrow:
reader = csv.reader(sortrow.readlines(), delimiter=',')
sortedlist = sorted(reader, key=operator.itemgetter(int(2)), reverse=True)
for row in sortedlist:
print(row)我很亲近。然而,这是我的结果:
['Name', 'Color', 'Age']
['Mark', 'Red', '9999']
['Lisa', 'Pink', '99']
['Bob', 'Red', '712']
['Corey', 'Orange', '44']
['Jacob', 'Yellow', '333']
['Alice', 'Green', '1']我想要的结果是:
['Name', 'Color', 'Age']
['Mark', 'Red', '9999']
['Bob', 'Red', '712']
['Jacob', 'Yellow', '333']
['Lisa', 'Pink', '99']
['Corey', 'Orange', '44']
['Alice', 'Green', '1']如您所见,它将第三列的内容视为字符串,即使在我将其转换为int之后也是如此,并将它们排序为字符串。
我还尝试了这个代码#sortedlist = sorted(reader, key=lambda x: int(x[2]), reverse=True),它按我想要的数字排序。但是,只有当我从测试数据中删除标题行时,这才有效。
这个问题有更容易解决的办法吗?
#sortedlist = sorted(reader, key=lambda x: int(x[2]), reverse=True)对数据进行排序发布于 2021-11-23 07:26:43
只有CSV阅读器才能做到这一点,而且没有什么特别之处,这将使您感到满意:
您的代码看起来很好,但是您对CSV读取器的使用有点不太好。我肯定会让csv.reader读一读,并记下示例中正在发生的事情,特别是只给读者提供您的文件,而不是调用readlines()。对于不需要指定的默认值(例如,'r'和delimter=','),该示例也是一个很好的模板。
import csv
sorted_list = []
with open('CleanReport.csv', newline='') as f:
reader = csv.reader(f)
sorted_list.append(next(reader)) # add header as first row
sorted_list.extend(
sorted(reader, key=lambda row: int(row[2]), reverse=True)
)
for row in sorted_list:
print(row)当我对你的样本CSV进行测试时,我得到:
['Name', 'Color', 'Age']
['Mark', 'Red', '9999']
['Bob', 'Red', '712']
['Lisa', 'Pink', '99']
['Corey', 'Orange', '44']
['Jacob', 'Yellow', '33']
['Alice', 'Green', '1']你在寻找一种“更简单的解决办法”,而不仅仅是解决这个问题所采取的最起码的步骤.它不会比以下更容易:
此外,如果您都需要一种自动排序CSV文件的方法,我非常喜欢csvkit的csvsort和GoCSV的排序等CSV命令行工具。两者都可以执行基本类型推断,并将第二列排序为整数。我写了几十个一次性Python脚本来处理普通的CSV进程,而且通常会有一些小的、愚蠢的bug。这些操作总是能够正确完成的:只有一个命令或命令管道;没有更多的Python行和行。
https://stackoverflow.com/questions/70074891
复制相似问题