測試環境為 CentOS8 (虛擬機)
這邊看一下 Python 內建的 CSV 模組,參考範例 – https://shengyu7697.github.io/python-write-csv-file/
Writer
先來看一下 Writer 的方法.
- csvwriter.writerow(row)
單筆資料的寫入,列(row)須為 list 格式 如: [‘A’ , ‘B’ , ‘C’] .import csv with open('output_data.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(['No', 'Name', 'Score']) writer.writerow([1, 'Tom', 87.3]) writer.writerow([2, 'Mary', 76.4]) writer.writerow([3, 'Mark', 65.5])
output_data.csv 檔案內容.
No,Name,Score 1,Tom,87.3 2,Mary,76.4 3,Mark,65.5
下面來說明一下程式碼.
匯入 csv 套件功能.
import csv
使用 with 語法時,可以免除自行編寫 try 與 finially, 詳細請參考 – https://benjr.tw/104769
使用 File 物件 & Open 函式模式為 w – Write 寫入模式(當檔案不存在時新增檔案,檔案存在時覆寫原檔案),詳細請參考 – https://benjr.tw/104316with open('output_data.csv' , 'w', newline='') as csvfile:
使用 csv 模組的 writer functions 回傳值為 writer 物件,輸入值可以為任何有 write() method 的物件 (這邊的 csvfile 為 file 物件).
writer = csv.writer(csvfile)
使用剛剛產生的 writer 物件透過 writerow(row) 將單筆資料寫入到檔案,其列(row) 格式可為 list 如: [‘A’ , ‘B’ , ‘C’].
writer.writerow(['No', 'Name', 'Score']) writer.writerow([1, 'Tom', 87.3]) writer.writerow([2, 'Mary', 76.4]) writer.writerow([3, 'Mark', 65.5])
- csvwriter.writerows(rows)
多筆資料的寫入,其 rows 須為可以迭代物件(如 List 物件).import csv my2dlist = [ ['No', 'Name', 'Score'], [4, 'Tom', 87.3], [5, 'Mary', 76.4], [6, 'Mark', 65.5] ] path = 'output_data.csv' with open(path, 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerows(my2dlist)
output_data.csv 檔案內容.
No,Name,Score 4,Tom,87.3 5,Mary,76.4 6,Mark,65.5
跟前面程式碼不同的是使用了 writerows 方法,這方法可以一次寫入多筆資料,其 rows 須為可以迭代物件 (如 my2dlist 為 List 物件).
writer.writerows(my2dlist)
除以上格式外,試過從 SQLite SELECT 得到的資料格式也可以.
my2dlist = [ ('No', 'Name', 'Score'), (7, 'Tom', 87.3), (8, 'Mary', 76.4), (9, 'Mark', 65.5) ]
- DictWriter.writeheader
當資料格式為 dict ( dictionary ) 資料型態物件,資料是由 key (鍵值) + Value (值) 組成.import csv mydict1 = {'No':10, 'Name':'Tom', 'Score':87.3} mydict2 = {'No':11, 'Score':76.4, 'Name':'Mary'} mydict3 = {'Name':'Mark', 'Score':65.5, 'No':12} with open('output_data.csv' , 'w', newline='') as csvfile: writer = csv.writer(csvfile) headers = ['No', 'Name', 'Score'] writer = csv.DictWriter(csvfile, fieldnames=headers) writer.writeheader() writer.writerow(mydict1) writer.writerow(mydict2) writer.writerow(mydict3)
output_data.csv 檔案內容.
No,Name,Score 10,Tom,87.3 11,Mary,76.4 12,Mark,65.5
下面來說明:
資料是由 key (鍵值) + Value (值) 組成所以不用照順序.mydict1 = {'No':10, 'Name':'Tom', 'Score':87.3} mydict2 = {'No':11, 'Score':76.4, 'Name':'Mary'} mydict3 = {'Name':'Mark', 'Score':65.5, 'No':12}
跟前面程式碼不同的是使用了 header ,因資料格式為 dict 需搭配 csv.DictWriter 方法來指定.
headers = ['No', 'Name', 'Score'] writer = csv.DictWriter(csvfile, fieldnames=headers)
這邊還需多一步驟是把 Header 資料寫入.
writer.writeheader()
如資料格式為 List 的 dict 一樣直接透過 writerows 方法多筆寫入.
import csv mylist = [ {'No':13, 'Name':'Tom', 'Score':87.3}, # dict {'No':14, 'Name':'Mary', 'Score':76.4}, # dict {'No':15, 'Name':'Mark', 'Score':65.5} # dict ] with open('output_data.csv' , 'w', newline='') as csvfile: writer = csv.writer(csvfile) headers = ['No', 'Name', 'Score'] writer = csv.DictWriter(csvfile, fieldnames=headers) writer.writeheader() writer.writerows(mylist)
output_data.csv 檔案內容.
No,Name,Score 13,Tom,87.3 14,Mary,76.4 15,Mark,65.5
Reader
csv 一樣可以讀取檔案,下面看一個 Reader 方法的簡單範例.
import csv with open('output_data.csv', newline='') as f: reader = csv.reader(f) for row in reader: print(row)
執行結果
['No', 'Name', 'Score'] ['13', 'Tom', '87.3'] ['14', 'Mary', '76.4'] ['15', 'Mark', '65.5']