SET
我有一个csv file
其中包括我的茶点的当前余额(它是逗号分隔的,但在本例中逗号,
为了提高可读性而删除):
NAME AMOUNT PRICE
Coca-Cola 8 1.25
Fanta 6 1.29
Dr. Pepper 2 2.20
Sprite 10 1.35
Guarana 6 1.80
Pepsi 4 1.25
我将所有数据读入内存(列表)并使用以下命令进行所有必要的编辑:
import csv
# format list for refreshments
items_list = []
with open("my_refresments.csv", newline='') as fileOpener:
open_csv = csv.reader(fileOpener)
for rows in open_csv:
items_list.append(rows)
列表“items_list”现在打印为:
items_list = [["NAME","AMOUNT","PRICE"],
["Coca-Cola","8","1.25"],
["Fanta","6","1.29"],
["Dr. Pepper","2","2.20"],
["Sprite","10","1.35"],
["Guarana","6","1.80"],
["Pepsi","4","1.25"]]
QUESTION
是什么给了我这种排序:
# Notice that this is sorted, but items_list[0] is at it's place
items_list = [["NAME","AMOUNT","PRICE"],
["Coca-Cola","8","1.25"],
["Fanta","6","1.29"],
["Dr. Pepper","2","2.20"],
["Sprite","10","1.35"],
["Guarana","6","1.80"],
["pepsi","4","1.25"]]
除第一行外的所有内容items_list[0]
应该保持未分类,因此原地不动。
对列表进行排序
一般来说a.sort()
对于嵌套列表来说,这是一个不错的选择,因为它不会对列表中的所有单个项目进行排序,而是对列表进行比较排序。在这种情况下我不能使用items_list.sort()
,因为它还将包含 csv 文件中的标题,我想将其保留在它已经所在的位置:items_list[0]
。这是使用时发生的情况items_list.sort()
:
items_list.sort()
[['Coca-Cola', '8', '1.25'],
['Fanta', '6', '1.29'],
['Dr. Pepper', '2', '2.20'],
['Sprite', '10', '1.35'],
['Guarana', '6', '1.80'],
['NAME', 'AMOUNT', 'PRICE'],
['Pepsi', '4', '1.25']]
奇怪的是,如果我把所有的茶点都写成lower case
,它会起作用,因为TEXT > text
, but 我不想那样做。我想用slice
排除第一行(标题),但它似乎没有任何效果(或者也许我做错了):
# This doesn't do anything
items_list[1:].sort()
一种可能的解决方案
我能做的就是
- 首先以某种方式将标题复制到另一个列表中
temp_list = [items_list[0]]
- delete
items_list[0]
使用del items_list[0]
陈述
- 使用对列表进行排序
items_list.sort()
,最后
- 将标题插入已排序的列表中
index(0)
with items_list.insert(0, temp_list)
像这样:
def sort_csv_list_exclude_headers(file_name):
items_list = []
with open(file_name, newline='') as fileOpener:
open_csv = csv.reader(fileOpener)
for rows in open_csv:
items_list.append(rows)
temp_list = [items_list[0]]
del items_list[0]
items_list.sort()
items_list.insert(0, temp_list[0])
with open(file_name, "w") as fileWriter:
write_csv = csv.writer(fileWriter, lineterminator='\n')
write_csv.writerows(items_list)
sort_csv_list_exclude_headers("SODA_BALANCE.csv")
实际上,当使用包含 > 1 000 000 行“茶点”的 csv 时,这通常非常好且简单。
子问题
还有其他(更简单)的方法吗?