【Python 筆記】csv 套件使用 感謝您點進本篇文章,我是 LukeTseng,該系列主要以筆記加上口語白話形式學習 Python,若文章某處有誤敬請告知,非常感謝。
什麼是 csv csv 的全名是 comma-separated values,逗號分隔數值。
csv 是一種純文字檔案格式,用逗號來分隔不同的資料欄位,每一行代表一筆記錄,常用於儲存和交換表格資料。
.csv 檔案如同用記事本就能打開的 Excel 表格,因為格式簡單、通用性高,幾乎所有試算表軟體和資料庫都能讀取。
而一般常見的 .csv 格式大概長像下面這樣:
1 2 3 name,age,department John Smith,30,Accounting Jane Doe,25,IT
第一行是標題列(欄位名稱),後面的每一行代表一筆資料記錄。
Python csv 套件 csv 是 python 早就內建在裡面的一個套件,所以不用特地安裝,只需要在程式碼中打下這一行指令去引入 csv 即可:
在做 csv 檔案操作的時候,需要應用到檔案處理的觀念,因此常常需要使用到 open() 函式開啟檔案。
之後範例均取自網站 Staffbase 中的 CSV 範例檔:https://support.staffbase.com/hc/en-us/articles/360007108391-CSV-File-Examples
讀入 csv 檔案 csv.reader() 使用 csv.reader() 方法做讀取動作,能夠逐行讀取 csv 檔,基本語法如下:
1 csv.reader(csvfile, dialect='excel' , **fmtparams)
csvfile:csv 的檔案物件。
dialect:定義一組參數來控制 CSV 讀取(預設為 excel)。
**fmtparams:附加格式參數,如 delimiter、quotechar 等。
範例:
username-password-recovery-code.csv:
1 2 3 4 5 6 Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location booker12;9012;12se74;rb9012;Rachel;Booker;Sales;Manchester grey07;2070;04ap67;lg2070;Laura;Grey;Depot;London johnson81;4081;30no86;cj4081;Craig;Johnson;Depot;London jenkins46;9346;14ju73;mj9346;Mary;Jenkins;Engineering;Manchester smith79;5079;09ja61;js5079;Jamie;Smith;Engineering;Manchester
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import csvwith open ('username-password-recovery-code.csv' , 'r' , encoding='utf-8' ) as file: csv_reader = csv.reader(file, delimiter=';' ) headers = next (csv_reader) print ("標題:" , headers) print ("-" * 50 ) for row in csv_reader: username = row[0 ] identifier = row[1 ] first_name = row[4 ] last_name = row[5 ] department = row[6 ] location = row[7 ] print (f"{first_name} {last_name} - {department} ({location} )" )
Output:
1 2 3 4 5 6 7 標題: ['Username', ' Identifier', 'One-time password', 'Recovery code', 'First name', 'Last name', 'Department', 'Location'] -------------------------------------------------- Rachel Booker - Sales (Manchester) Laura Grey - Depot (London) Craig Johnson - Depot (London) Mary Jenkins - Engineering (Manchester) Jamie Smith - Engineering (Manchester)
next() 函數是 Python 內建函數,用來從迭代器(iterator)中取得下一個元素。可以把 csv 看成是一串一串的串列所組成,標題是一整個串列,而在一開始就先讀掉標題行的話,那之後讀取就不會再讀到標題行了,而是直接單刀直入看數據的部分。
csv.DictReader() 語法同 csv.reader(),只是回傳的型態變成字典(Dict)。
範例:
1 2 3 4 5 import csvwith open ('username-password-recovery-code.csv' , mode ='r' ) as file: csv_DictReader = csv.DictReader(file) for lines in csv_DictReader: print (lines)
Output:
1 2 3 4 5 {'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'booker12;9012;12se74;rb9012;Rachel;Booker;Sales;Manchester'} {'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'grey07;2070;04ap67;lg2070;Laura;Grey;Depot;London'} {'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'johnson81;4081;30no86;cj4081;Craig;Johnson;Depot;London'} {'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'jenkins46;9346;14ju73;mj9346;Mary;Jenkins;Engineering;Manchester'} {'Username; Identifier;One-time password;Recovery code;First name;Last name;Department;Location': 'smith79;5079;09ja61;js5079;Jamie;Smith;Engineering;Manchester'}
寫入 csv 檔案 csv.writer() 使用 csv.writer() 做寫入動作。
語法與 csv.reader() 相同。
範例:
1 2 3 4 5 6 7 8 9 10 11 12 import csvstudents = [ ['姓名' , '成績' , '科系' ], ['LukeTseng' , 100 , '資工系' ], ['陳圈翔' , 92 , '電科系' ], ['XX' , 78 , '資管系' ] ] with open ('grades.csv' , 'w' , encoding='utf-8' , newline='' ) as file: csv_writer = csv.writer(file) csv_writer.writerows(students)
由於我這邊沒有已存在的 grades.csv 檔案,因此他會生成出一個檔案,內容如下:
1 2 3 4 姓名,成績,科系 LukeTseng,100,資工系 陳圈翔,92,電科系 XX,78,資管系
csv.DictWriter() 語法基本上都一樣,就不細講了。
跟 DictReader() 相反,這是以字典的形式寫入 csv。
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import csvstudents = [ {'name' : 'LukeTseng' , 'age' : 18 , 'major' : '資工' }, {'name' : '陳圈翔' , 'age' : 19 , 'major' : '電科' } ] with open ('output.csv' , 'w' , encoding='utf-8' , newline='' ) as file: fieldnames = ['name' , 'age' , 'major' ] writer = csv.DictWriter(file, fieldnames=fieldnames) writer.writeheader() writer.writerows(students)
輸出的 output.csv 得到:
1 2 3 name,age,major LukeTseng,18,資工 陳圈翔,19,電科
總結 csv 套件使用上很簡單,後續可以透過 excel 或是 python 另一個套件 pandas 進行分析處理。
ok 我是 LukeTseng,下次見。
參考資料 Reading CSV files in Python - GeeksforGeeks
Working with csv files in Python - GeeksforGeeks
Writing CSV files in Python - GeeksforGeeks
CSV 檔案操作 - Python 教學 | STEAM 教育學習網