# 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. 找到最高價那個月