# 【Python 筆記】csv 套件使用 [TOC] 感謝您點進本篇文章,我是 LukeTseng,該系列主要以筆記加上口語白話形式學習 Python,若文章某處有誤敬請告知,非常感謝。 ## 什麼是 csv csv 的全名是 comma-separated values,逗號分隔數值。 csv 是一種純文字檔案格式,用逗號來分隔不同的資料欄位,每一行代表一筆記錄,常用於儲存和交換表格資料。 .csv 檔案如同用記事本就能打開的 Excel 表格,因為格式簡單、通用性高,幾乎所有試算表軟體和資料庫都能讀取。 而一般常見的 .csv 格式大概長像下面這樣: ``` name,age,department John Smith,30,Accounting Jane Doe,25,IT ``` 第一行是標題列(欄位名稱),後面的每一行代表一筆資料記錄。 ## Python csv 套件 csv 是 python 早就內建在裡面的一個套件,所以不用特地安裝,只需要在程式碼中打下這一行指令去引入 csv 即可: ```python import csv # 或是 from csv import * ``` 在做 csv 檔案操作的時候,需要應用到檔案處理的觀念,因此常常需要使用到 `open()` 函式開啟檔案。 之後範例均取自網站 Staffbase 中的 CSV 範例檔:https://support.staffbase.com/hc/en-us/articles/360007108391-CSV-File-Examples ## 讀入 csv 檔案 ### csv.reader() 使用 `csv.reader()` 方法做讀取動作,能夠逐行讀取 csv 檔,基本語法如下: ```python csv.reader(csvfile, dialect='excel', **fmtparams) ``` `csvfile`:csv 的檔案物件。 `dialect`:定義一組參數來控制 CSV 讀取(預設為 excel)。 `**fmtparams`:附加格式參數,如 delimiter、quotechar 等。 範例: `username-password-recovery-code.csv`: ``` 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 ``` ```python= import csv # 讀取 CSV 檔案 with 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: ``` 標題: ['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)。 範例: ```python= import csv with open('username-password-recovery-code.csv', mode ='r') as file: csv_DictReader = csv.DictReader(file) for lines in csv_DictReader: print(lines) ``` Output: ``` {'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()` 相同。 範例: ```python= import csv students = [ ['姓名', '成績', '科系'], ['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` 檔案,因此他會生成出一個檔案,內容如下: ``` 姓名,成績,科系 LukeTseng,100,資工系 陳圈翔,92,電科系 XX,78,資管系 ``` ### csv.DictWriter() 語法基本上都一樣,就不細講了。 跟 `DictReader()` 相反,這是以字典的形式寫入 csv。 範例: ```python= import csv # 寫入字典 students = [ {'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 得到: ``` name,age,major LukeTseng,18,資工 陳圈翔,19,電科 ``` ## 總結 csv 套件使用上很簡單,後續可以透過 excel 或是 python 另一個套件 pandas 進行分析處理。 ok 我是 LukeTseng,下次見。 ## 參考資料 [Reading CSV files in Python - GeeksforGeeks](https://www.geeksforgeeks.org/pandas/reading-csv-files-in-python/) [Working with csv files in Python - GeeksforGeeks](https://www.geeksforgeeks.org/python/working-csv-files-python/) [Writing CSV files in Python - GeeksforGeeks](https://www.geeksforgeeks.org/python/writing-csv-files-in-python/) [CSV 檔案操作 - Python 教學 | STEAM 教育學習網](https://steam.oxxostudio.tw/category/python/library/csv.html)