---
# System prepended metadata

title: CSV Comma Separated Values

---

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