本篇介紹如何用 python read csv 檔案,csv 檔案格式是常用格式,以下將示範如何用 python 的內建 csv 模組來讀取 csv 檔案。
以下是 Python 讀取 csv 的幾個章節,分為這幾部份,
- 相似於C語言的寫法
- 使用 with open(…) as …
- 取出第一欄欄位名稱 headers
- 將讀取的欄位轉換變數類型存到串列 list 裡
- 將讀取的 csv 內容轉成 NumPy array
- 使用 NumPy 的 genfromtxt 來讀取 csv
相似於C語言的寫法
以下範例是將 data.csv 檔案讀取近來後, 之後將每行的內容印出來。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 內容如下,1
2
3
41,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,輸出結果是一樣的。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 內容如下,1
2
3
4
5No,Name,Score
1,Tom,87.3
2,Mary,76.4
3,Mark,65.5
4,Jason,54.6
這裡next是將讀取指針移到下一行,回傳的資料為當前行數的資料,
header為csv的第一行欄位名稱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
5headers: ['No', 'Name', 'Score']
['1', 'Tom', '87.3']
['2', 'Mary', '76.4']
['3', 'Mark', '65.5']
['4', 'Jason', '54.6']
將讀取的欄位轉換變數類型存到串列 list 裡
這邊示範將讀出來的每個欄位轉換成適當的變數類型,例如轉整數用 int()
、轉浮點數用 float()
,最後 append 到串列 list 裡,以便後續處理,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,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 來讀取 csv1
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 資料再畫圖