# CSV Comma Separated Values 一個處理數據的方式是用「試算表」,有欄位及其對應的內容, 那怎麼讓程式讀寫呢?其中一個方法是用CSV,他是試算表、資料庫通用的形式,用逗號隔開資料。 舉例來說,以下一份資料: | 國文 | 英文 | 數學 | | ---- | ---- | ----| | 97 | 88 | 60 | | 33 | 77 | 99 | 轉換為CSV: ```text= 國文,英文,數學 97,88,60 33,77,99 ``` ## reader() 我們先將剛剛的例子放進一個名為 `score.txt` 的文字檔。 然後再進行以下的操作: ```python= import csv file = open('score.txt', 'r') for row in csv.reader(file): print(row) file.close() # ['國文','英文','數學'] # ['97','88','60'] # ['33','77','99'] ``` 可以用 `delimiter` 參數設定間隔符號(預設為逗號): ```python= csv.reader(file, delimiter = ' ') # 用空格作為間隔符號 ``` ## writer.writerow()、writer.writerows() ```python= import csv # 新建一個檔案,用來寫入。將預設換行改為空字串 f = open('score.txt' , 'w', encoding='UTF-8', newline='') # 欲填入的資料,每一行是一個list,並用list包起來。 score = [['國文', '英文', '數學'], ['99', '88', '77'], ['11', '22', '33'], ['55', '66' ,'13'], ] for line in score: csv.writer(f).writerow(line) f.close() # 看看結果~ with open('score.txt', 'r', encoding='UTF-8') as f: for line in csv.reader(f): print(line) ``` 其中,第11、12行可以改為: ```python= csv.writer(f).writerows(score) ``` ## DictReader() 將CSV用字典讀,預設第一行為 header ```python= import csv with open('score.txt' , 'r', encoding='UTF-8') as f: for row in csv.DictReader(f): print(row) ``` 如果第一行沒有header,可以自己指定: `csv.DictReader(f, filednames=['國文', '英文', '數學'])` ## DictWriter() 可以將字典寫進CSV: ```python= import csv score = [ {'數學':99, '英文':66}, {'數學':59, '英文':88} ] with open('dictCSV.csv', 'w', newline='', encoding='UTF-8') as f: writer = csv.DictWriter(f, fieldnames=['數學', '英文']) writer.writeheader() writer.writerows(score) ``` ## 實戰 到[台灣證券交易所](https://www.twse.com.tw/zh/page/trading/exchange/FMSRFK.html)( 首頁>交易資訊>盤後資訊>個股月成交資訊) 找資料下載為CSV處理。 例如:[110年0050](https://www.twse.com.tw/exchangeReport/FMSRFK?response=csv&date=20210101&stockNo=0050) 做以下嘗試: 1. 將不要的資訊刪除 2. 將字串轉為數字 3. 將年度當月最高價變為一個字串 4. 找到最高價那個月