我有一個名為“CleanReport.csv”的 csv 檔案,其中包含一些示例資料,如下所示:
Name,Color,Age
Mark,Red,9999
Bob,Red,712
Alice,Green,1
Lisa,Pink,99
Jacob,Yellow,33
Corey,Orange,44
并使用 Python 我試圖按列“年齡”(在索引 2 處)進行排序,而不會丟失標題列在開頭的位置。這是我的代碼:
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)
我很親近。然而,這是我的結果:
['Name', 'Color', 'Age']
['Mark', 'Red', '9999']
['Lisa', 'Pink', '99']
['Bob', 'Red', '712']
['Corey', 'Orange', '44']
['Jacob', 'Yellow', '333']
['Alice', 'Green', '1']
我想要的結果是這樣的:
['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),它按照我想要的數字排序。但是,這僅在我從測驗資料中洗掉標題行時才有效。
有沒有更簡單的方法來解決這個問題,而不必
- 以某種方式取出標題行并將其存盤在變數中
- 使用排序資料
#sortedlist = sorted(reader, key=lambda x: int(x[2]), reverse=True) - 創建一個帶有標題行的新 csv
- 使用回圈將 sortedlist 中的每一行一一添加到同一個新的 csv 中?
uj5u.com熱心網友回復:
有一種通用的方法可以只用 CSV 閱讀器來做到這一點,沒有別的花哨的東西,這會讓你:
- 標題
- “資料”按您的意愿排序
- 變數保持最少,只有一個,sorted_list
您的代碼看起來不錯,但您對 CSV 閱讀器的使用有點偏離。我肯定會閱讀csv.reader的檔案并記下示例中發生的事情,尤其是只向讀者提供您的檔案,而不是呼叫readlines(). 該示例也是您不需要指定的默認值(如'r'、 和delimter=',')的好模板。
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 運行它時,我得到:
['Name', 'Color', 'Age']
['Mark', 'Red', '9999']
['Bob', 'Red', '712']
['Lisa', 'Pink', '99']
['Corey', 'Orange', '44']
['Jacob', 'Yellow', '33']
['Alice', 'Green', '1']
您正在尋找一種“更簡單的修復”,而不僅僅是解決這個問題所需的最少步驟......它沒有(不能)比以下更容易:
- 讀取/存盤標頭
- 讀取所有“資料”行
- 對所有“資料”行進行排序
- 將標題添加到已排序的資料行
另外,如果您需要一種自動排序 CSV 檔案的方法,我非常喜歡 CSV 命令列工具,例如 csvkit 的csvsort和 GoCSV 的sort。兩者都可以執行基本型別推斷并將第二列按整數排序。我寫了幾十個一次性的 Python 腳本來處理普通的 CSV 行程,通常會有一些小而愚蠢的錯誤。這些總是可以正確完成作業:只需一個命令或命令管道;沒有更多的 Python 行了。
uj5u.com熱心網友回復:
解決它的一種方法是使用 DictReader 將其作為 dict 閱讀
import csv
from pprint import pp #not needed, but prints the dict better
with open('CleanReport.csv', 'r') as f:
reader = csv.DictReader(f.read().splitlines(), delimiter=',')
sorted_dict = sorted(reader, key=lambda x: int(x["Age"]), reverse=True)
pp(sorted_dict)
輸出
[{'Name': 'Mark', 'Color': 'Red', 'Age': '9999'},
{'Name': 'Bob', 'Color': 'Red', 'Age': '712'},
{'Name': 'Lisa', 'Color': 'Pink', 'Age': '99'},
{'Name': 'Corey', 'Color': 'Orange', 'Age': '44'},
{'Name': 'Jacob', 'Color': 'Yellow', 'Age': '33'},
{'Name': 'Alice', 'Color': 'Green', 'Age': '1'}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/366844.html
上一篇:在r中重組資料
