首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用带有数值(和头)的列对Python中的CSV进行排序

用带有数值(和头)的列对Python中的CSV进行排序
EN

Stack Overflow用户
提问于 2021-11-23 03:00:30
回答 2查看 207关注 0票数 1

我有一个名为"CleanReport.csv“的csv文件,其中包含一些示例数据,如下所示:

代码语言:javascript
运行
复制
Name,Color,Age
Mark,Red,9999
Bob,Red,712
Alice,Green,1
Lisa,Pink,99
Jacob,Yellow,33
Corey,Orange,44

使用Python,我试图按列“Age”(在索引2处)进行排序,而不松开头列在开头的位置。这是我的代码:

代码语言:javascript
运行
复制
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)

我很亲近。然而,这是我的结果:

代码语言:javascript
运行
复制
['Name', 'Color', 'Age']
['Mark', 'Red', '9999']
['Lisa', 'Pink', '99']
['Bob', 'Red', '712']
['Corey', 'Orange', '44']
['Jacob', 'Yellow', '333']
['Alice', 'Green', '1']

我想要的结果是:

代码语言:javascript
运行
复制
['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),它按我想要的数字排序。但是,只有当我从测试数据中删除标题行时,这才有效。

这个问题有更容易解决的办法吗?

  1. 以某种方式取出标题行并将其存储在一个变量中。
  2. 使用#sortedlist = sorted(reader, key=lambda x: int(x[2]), reverse=True)对数据进行排序
  3. 创建一个新的csv,并将标题行追加到它
  4. 使用循环将排序列表中的每一行分别追加到相同的新csv中?
EN

Stack Overflow用户

发布于 2021-11-23 07:26:43

只有CSV阅读器才能做到这一点,而且没有什么特别之处,这将使您感到满意:

  1. 标题
  2. 按需要排序的“数据”
  3. 变量保持在最小,只有一个,sorted_list

您的代码看起来很好,但是您对CSV读取器的使用有点不太好。我肯定会让csv.reader读一读,并记下示例中正在发生的事情,特别是只给读者提供您的文件,而不是调用readlines()。对于不需要指定的默认值(例如,'r'delimter=','),该示例也是一个很好的模板。

代码语言:javascript
运行
复制
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进行测试时,我得到:

代码语言:javascript
运行
复制
['Name', 'Color', 'Age']
['Mark', 'Red', '9999']
['Bob', 'Red', '712']
['Lisa', 'Pink', '99']
['Corey', 'Orange', '44']
['Jacob', 'Yellow', '33']
['Alice', 'Green', '1']

你在寻找一种“更简单的解决办法”,而不仅仅是解决这个问题所采取的最起码的步骤.它不会比以下更容易:

  1. 读取/存储报头
  2. 读取所有“数据”行
  3. 对所有“数据”行进行排序
  4. 为排序的数据行预置头

此外,如果您都需要一种自动排序CSV文件的方法,我非常喜欢csvkit的csvsort和GoCSV的排序等CSV命令行工具。两者都可以执行基本类型推断,并将第二列排序为整数。我写了几十个一次性Python脚本来处理普通的CSV进程,而且通常会有一些小的、愚蠢的bug。这些操作总是能够正确完成的:只有一个命令或命令管道;没有更多的Python行和行。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70074891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档