我有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]]
items_list[0]
声明del 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")
实际上,当使用带有>的csv时,这一般非常简单和简单。 1 000 000行“茶点”。
还有其他(更简单的)方法吗?
答案 0 :(得分:0)
这是简单的可能解决方案,
[items_list[0]] + sorted(items_list[1:])
或使用pandas
如果没有理由不使用
感谢juanpa.arrivillaga
解释为何使用sorted()
而不是.sort()
sorted()
返回排序列表,但.sort()
是自己的更改列表。 (不归)
所以如果您想使用.sort()
,那么代码将是
values = items_list[1:].sort()
item_list = [item_list[0]] + values
使用sorted
更短!
答案 1 :(得分:0)
我能想到的最简单方法是使用pandas
。
使用pandas阅读csv:
df = pd.read_csv("my_refresments.csv")
df.sort_values("PRICE")
根据价格对数据进行排序,标题存储在df.columns
中,因此不会对实际数据进行排序。
答案 2 :(得分:0)