【发布时间】:2018-03-06 00:08:37
【问题描述】:
设置
我有一个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"]]
问题
是什么给了我这种排序:
# 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,但是我不想这样做。我想使用slice 排除第一行(标题),但它似乎没有任何效果(或者我做错了):
# This doesn't do anything
items_list[1:].sort()
一种可能的解决方案
我能做的就是
- 首先以一种或另一种方式将标题复制到另一个列表中
temp_list = [items_list[0]] - 使用
del items_list[0]语句删除items_list[0] - 使用
items_list.sort()对列表进行排序,最后 - 将标题插入排序列表的
index(0)和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 时,这通常非常好且简单。
子问题
还有其他(更简单的)方法吗?
【问题讨论】:
-
.sort方法有效,因此items_list[1:].sort()会创建一个新列表items_list[1:],然后您对该新列表进行排序,但该方法返回None,并且您永远不会捕获结果,因此列表立即被丢弃。使用sorted,它返回一个新列表。