Python 讀取 csv 檔案

本篇介紹如何用 python read csv 檔案,csv 檔案格式是常用格式,以下將示範如何用 python 的內建 csv 模組來讀取 csv 檔案。

以下是 Python 讀取 csv 的幾個章節,分為這幾部份,

  • 相似於C語言的寫法
  • 使用 with open(…) as …
  • 取出第一欄欄位名稱 headers
  • 將讀取的欄位轉換變數類型存到串列 list 裡
  • 將讀取的 csv 內容轉成 NumPy array
  • 使用 NumPy 的 genfromtxt 來讀取 csv

相似於C語言的寫法

以下範例是將 data.csv 檔案讀取近來後, 之後將每行的內容印出來。

python3-csv-read.py
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import csv

path = 'data.csv'
try:
f = open(path, 'r')
rows = csv.reader(f, delimiter=',')
for row in rows:
print(row)
except:
print('ERROR: can not found ' + path)
exit(1)

data.csv 內容如下,

data.csv
1
2
3
4
1,Tom,0.2,
2,Mary,0.5,
3,Mark,0.8,
4,Jason,1.1,

輸出如下,值得注意的是行尾有一個逗號會被當成空資料,

1
2
3
4
['1', 'Tom', '87.3', '']
['2', 'Mary', '76.4', '']
['3', 'Mark', '65.5', '']
['4', 'Jason', '54.6', '']

使用 with open(…) as …

這是 Python 建議的另外一種讀取 csv 寫法,使用 with 語法,
先使用 open 再使用 csv.reader,輸出結果是一樣的。

python3-csv-read2.py
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import csv

path = 'data.csv'
with open(path, newline='') as csvfile:
rows = csv.reader(csvfile, delimiter=',')
for row in rows:
print(row)

取出第一欄欄位名稱 headers

data2.csv 內容如下,

data2.csv
1
2
3
4
5
No,Name,Score
1,Tom,87.3
2,Mary,76.4
3,Mark,65.5
4,Jason,54.6

這裡next是將讀取指針移到下一行,回傳的資料為當前行數的資料,
header為csv的第一行欄位名稱

python3-csv-read3.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import csv

path = 'data2.csv'
with open(path, newline='') as csvfile:
rows = csv.reader(csvfile, delimiter=',')
headers = next(rows)
print('headers: %s' % headers)
for row in rows:
print(row)

輸出如下,值得注意的是行尾沒有逗號就沒有空資料,

1
2
3
4
5
headers: ['No', 'Name', 'Score']
['1', 'Tom', '87.3']
['2', 'Mary', '76.4']
['3', 'Mark', '65.5']
['4', 'Jason', '54.6']

將讀取的欄位轉換變數類型存到串列 list 裡

這邊示範將讀出來的每個欄位轉換成適當的變數類型,例如轉整數用 int()、轉浮點數用 float(),最後 append 到串列 list 裡,以便後續處理,

python3-csv-read4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import csv

id = []
name = []
score = []
path = 'data2.csv'
with open(path, newline='') as csvfile:
rows = csv.reader(csvfile, delimiter=',')
headers = next(rows)
for row in rows:
id.append(int(row[0]))
name.append(row[1])
score.append(float(row[2]))

print(id)
print(name)
print(score)

輸出如下,

1
2
3
[1, 2, 3, 4]
['Tom', 'Mary', 'Mark', 'Jason']
[87.3, 76.4, 65.5, 54.6]

將讀取的 csv 內容轉成 NumPy array

以下範例是將讀取到 csv 內容轉成 NumPy array,

python3-csv-read5.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import csv
import numpy as np

path = 'data.csv'
with open(path, newline='') as csvfile:
rows = csv.reader(csvfile, delimiter=',')
data = np.asarray(list(rows))
print(data)

輸出:

1
2
3
4
[['1' 'Tom' '87.3' '']
['2' 'Mary' '76.4' '']
['3' 'Mark' '65.5' '']
['4' 'Jason' '54.6' '']]

使用 NumPy 的 genfromtxt 來讀取 csv

以下範例是使用 NumPy 的 genfromtxt 來讀取 csv

python3-csv-read6.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import csv
import numpy as np

path = 'data.csv'
data = np.genfromtxt(path, delimiter=',')
print(data)
print(data[0])
print(data[1])
print(data[0][0])
print(data[1][0])

輸出如下所示,字串的部份變成nan之後有空再看看為什麼,

1
2
3
4
5
6
7
8
[[ 1.   nan 87.3  nan]
[ 2. nan 76.4 nan]
[ 3. nan 65.5 nan]
[ 4. nan 54.6 nan]]
[ 1. nan 87.3 nan]
[ 2. nan 76.4 nan]
1.0
2.0

根據這篇網友提到使用 NumPy 提供的讀取csv方法來讀取會比內建csv所花飛的時間多,所以這邊是建議可以使用內建csv提供的方法。

以上就是 Python 讀取 csv 檔案的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它參考
csv — CSV File Reading and Writing — Python 3 documentation
https://docs.python.org/3/library/csv.html#csv.reader
Working with csv files in Python - GeeksforGeeks
https://www.geeksforgeeks.org/working-csv-files-python/

相關主題
Python 寫入 csv 檔案
Python 讀檔,讀取 txt 文字檔
Python 讀寫檔案
Python 使用 numpy 讀取 csv 資料再畫圖