按列对 csv 进行排序
- 2025-03-04 08:25:00
- admin 原创
- 87
问题描述:
我想按日期对 CSV 表进行排序。开始是一个简单的任务:
import sys
import csv
reader = csv.reader(open("files.csv"), delimiter=";")
for id, path, title, date, author, platform, type, port in reader:
print date
我使用 Python 的 CSV 模块读取具有该结构的文件:
id;file;description;date;author;platform;type;port
日期是 ISO-8601,因此我可以很容易地对其进行排序而无需解析:例如 2003-04-22
我想按日期排序,最新条目优先
如何让这个阅读器进入可排序的数据结构?我认为只要花点功夫就可以制作一个日期列表:datelist += date,拆分和排序。但是我必须重新识别 CSV 表中的完整条目。这不仅仅是对事物列表进行排序。
csv 似乎没有内置排序功能
最佳解决方案是使用 CSV 客户端来像处理数据库一样处理文件。我没有找到类似的东西。
我希望有人知道一些好的排序魔法;)
解决方案 1:
由于'date'
列中有索引 3,
import operator
sortedlist = sorted(reader, key=operator.itemgetter(3), reverse=True)
或者使用 lambda
sortedlist = sorted(reader, key=lambda row: row[3], reverse=True)
解决方案 2:
按多列排序(按 排序column_1
,然后按 排序column_2
)
with open('unsorted.csv',newline='') as csvfile:
spamreader = csv.DictReader(csvfile, delimiter=";")
sortedlist = sorted(spamreader, key=lambda row:(row['column_1'],row['column_2']), reverse=False)
with open('sorted.csv', 'w') as f:
fieldnames = ['column_1', 'column_2', column_3]
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for row in sortedlist:
writer.writerow(row)
解决方案 3:
读取器的作用类似于生成器。在一个包含一些虚假数据的文件上:
>>> import sys, csv
>>> data = csv.reader(open('data.csv'),delimiter=';')
>>> data
<_csv.reader object at 0x1004a11a0>
>>> data.next()
['a', ' b', ' c']
>>> data.next()
['x', ' y', ' z']
>>> data.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
按照Ignacio 的建议使用 operator.itemgetter :
>>> data = csv.reader(open('data.csv'),delimiter=';')
>>> import operator
>>> sortedlist = sorted(data, key=operator.itemgetter(2), reverse=True)
>>> sortedlist
[['x', ' y', ' z'], ['a', ' b', ' c']]
解决方案 4:
对于按列对 csv 进行排序,我会使用类似这样的方法
import pandas
csvData = pandas.read_csv('myfile.csv')
csvData.sort_values(["date"], axis=0, ascending=[False], inplace=True)
print(csvData)
解决方案 5:
你可以用熊猫来做,这很容易
import pandas as pd
df = pd.read_csv("File.csv")
sorted_df = df.sort_values(by=["price","title",...], ascending=False)
sorted_df.to_csv('homes_sorted.csv', index=False)
.sort_values 方法返回一个新的数据框,因此请确保将其分配给一个新变量。
解决方案 6:
结合Ignacio Vazquez-Abram和Tiina给出的答案:
fieldnames = [ 'id', 'path', 'title', 'date', 'author', 'platform', 'type', 'port' ]
# this means: order by 'id', 'path', ..., 'port'
items = ('id', 'path', 'title', 'date', 'author', 'platform', 'type', 'port')
with open('unsorted.csv',newline='') as csvfile:
spamreader = csv.DictReader(csvfile, delimiter=";")
import operator
sortedlist = sorted(reader, key=operator.itemgetter(*items), reverse=True)
with open('sorted.csv', 'w') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for row in sortedlist:
writer.writerow(row)
有了这个,你可以
1-按多列对行进行排序。
2-更改要按其对行进行排序的列数,而无需使用 lambda 表达式
sortedlist = sorted(spamreader, key=lambda row:(row['column_1'],row['column_2']), reverse=False)
特别是,无需在 lambda 表达式中添加和删除列模式,以防将来您想按不同的列顺序对其他 csv 文件进行排序。
例如
items = ('path', 'title')
items = ('id', 'path', 'title', 'date')
items = ('author', 'date', 'title')
而不是
sortedlist = sorted(spamreader, key=lambda row:(row['column_2'],row['column_3']), reverse=False)
sortedlist = sorted(spamreader, key=lambda row:(row['column_1'],row['column_2'],,row['column_3'],row['column_4']), reverse=False)
sortedlist = sorted(spamreader, key=lambda row:(row['column_5'],row['column_4'],row['column_3']), reverse=False)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD