Python處理CSV文件

Python處理CSV文件

前言

CSV (Comma Separated Values) 格式是電子表格和數據庫中最常見的輸入、輸出文件格式,每一行 row 是一筆資料 record ,每個資料欄位 column 用 "," 逗號隔開,第一行 row 資料是表頭欄位。

大綱

使用筆記本開啟CSV檔案

我們使用 2019聯合國世界人口統計 CSV 下載檔案為例,利用筆記本打開可以看到資料的結構,每一個資料用 "," 逗號隔開的一行一行的資料,第一行資料使每一列的表頭欄位,如下:

CSV 模組

在Python 標準函式庫 (Standard Library)中,有內建的 csv 模組,可以輕鬆的讀寫CSV檔案,在程式中加上指令 import csv 即可。請參考 :  csv --- CSV 文件讀寫(外連結)

讀取CSV檔案

使用 open() 方法開啟檔案

open() 語法格式如下:

with open(csv檔案名稱) as csvFile

當然,您也可以使用傳統方式開啟檔案

csvFile = open(csv檔案名稱)

建立 reader 物件

我們開啟了檔案物件 csvFile ,然後用 csv 模組的 reader() 方法建立 reader 物件,再使用 list() 方法,將 reader 物件轉換成 python 資料格式 串列: list ,我們就可以開始使用串列資料了。

範例 pythonCSV-01.py : 開啟CSV文件,csv模組建立 reader 物件,再使用 list() reader 物件轉換成 python 資料格式 串列: list。

# pythonCSV-01.py
import csv

fileName = 'population2019-UN.csv'
with open(fileName) as csvFile:         # 開啟csv檔案
    csvReader = csv.reader(csvFile)     # 讀檔案建立Reader物件
    listPopulation = list(csvReader)    # 將資料轉成串列    
print(listPopulation)                   # 列印串列方法

利用迴圈 for-in 列出 reader 物件

範例 pythonCSV-02.py : 開啟CSV文件,csv模組建立 reader 物件,用迴圈 for-in 列出 reader 物件。

# pythonCSV-02.py
import csv

fileName = 'population2019-UN.csv'
with open(fileName) as csvFile:         # 開啟csv檔案
    csvReader = csv.reader(csvFile)     # 讀檔案建立Reader物件csvReader
    for row in csvReader:               # 用迴圈列出csvReader物件內容
        print("Row %s = " % csvReader.line_num, row)

利用迴圈 for-in 列出 串列list 內容

範例 pythonCSV-03.py : 利用迴圈 for-in 列出 串列list 內容。

# pythonCSV-03.py
import csv

fileName = 'population2019-UN.csv'
with open(fileName) as csvFile:         # 開啟csv檔案
    csvReader = csv.reader(csvFile)     # 讀檔案建立Reader物件csvReader
    listPopulation = list(csvReader)    # 將資料轉成串列   
    for row in listPopulation:          # 用迴圈列出串列內容
        print(row)

利用串列索引,單獨讀取個別欄位內容

範例 pythonCSV-04.py : 利用串列索引,單獨讀取個別行、欄位內容。

# pythonCSV-04.py
import csv

fileName = 'population2019-UN.csv'
with open(fileName) as csvFile:         # 開啟csv檔案
    csvReader = csv.reader(csvFile)     # 讀檔案建立Reader物件csvReader
    listPopulation = list(csvReader)    # 將資料轉成串列
print(listPopulation[0][1], listPopulation[0][4], listPopulation[0][8])   # 列出第1行第2欄位,第5欄位,第9欄位
print(listPopulation[1][1], listPopulation[1][4], listPopulation[1][8])   # 列出第2行第2欄位,第5欄位,第9欄位

DictReader()

範例 pythonCSV-05.py : 利用 DictReader() 方法,創建排序字典(OorderedDict),並印出 DictRewader 物件: csvDictReader 的特定的欄位內容。

# pythonCSV-05.py
import csv

fileName = 'population2019-UN.csv'
with open(fileName) as csvFile:         # 開啟csv檔案
    csvDictReader = csv.DictReader(csvFile)     # 讀檔案建立DictReader物件
    for row in csvDictReader:
        print(row['Location'], row['Time'], row['PopTotal'])

寫入CSV檔案

開啟 open() 關閉 close() 要寫入的檔案

csvFile = open('檔案名稱', 'w', newline = '')     # 開啟csv檔案,'w' 表示write only 唯寫,newline = ''  可避免在輸出時每一行之間會多空一行。

csvFile.close()    #執行結束,關閉檔案。

當使用 with ....as  開啟檔案時,會自動關閉檔案,所以不需要在執行程式結束時關閉檔案。

with open('檔案名稱', 'w', newline = '') as csvFile:    # 開啟csv檔案

建立writer物件

with open('檔案名稱', 'w', newline = '') as csvFile:
    csvWriter = csv.writer(csvFile) # 建立writer物件

或是

csvFile = open('檔案名稱', 'w', newline = '') 
csvWriter = csv.writer(csvFile)    # 建立writer物件
.......
csvFile.close()

輸出串列 writerow()

範例 pythonCSV-07.py : 拷貝檔案 : 讀入一個檔案,並寫入另一個檔案。

# pythonCSV-07.py
import csv

inputFileName = 'output-pythonCSV-06.csv'           # 來源檔案
outputFileName = 'output-pythonCSV-07.csv'          # 目的檔案
with open(inputFileName) as csvReadFile:            # 開啟csv檔案供讀取
    csvReader = csv.reader(csvReadFile)             # 讀檔案建立Reader物件
    listReport = list(csvReader)                    # 將資料轉成串列 

with open(outputFileName, 'w', newline = '') as csvWriteFile:   # 開啟csv檔案供寫入
    csvWriter = csv.writer(csvWriteFile)            # 建立Writer物件   
    for row in listReport:                          # 將串列寫入
        csvWriter.writerow(row)

參數 delimiter 分隔符號

CSV檔案預設欄位之間的分隔符號是 "," 逗號,可使用參數 delimiter 更改分隔符號。

範例 pythonCSV-08.py : 更改分隔符號為 定位點 \t。

# pythonCSV-08.py
import csv

fileName = 'output-pythonCSV-08.csv'
with open(fileName, 'w', newline = '') as csvFile:         # 開啟csv檔案
    csvWriterObj = csv.writer(csvFile, delimiter='\t')     # 建立Writer物件   
    csvWriterObj.writerow(['Name', 'Age', 'City'])
    csvWriterObj.writerow(['Hung', '35', 'Taipei'])
    csvWriterObj.writerow(['James', '40', 'Chicago'])

寫入字典資料 DictWriter()

其語法格式如下:

dictWriter = csv.DicWriter(csvFile, fieldnames=fields)

範例 pythonCSV-09.py : 使用 DictWriter() 將字典資料寫入 CSV 檔案

# pythonCSV-09.py
import csv

fileName = 'output-pythonCSV-09.csv'
with open(fileName, 'w', newline = '') as csvFile:     # 開啟csv檔案
    fields = ['Name', 'Age', 'City']
    dictWriterObj = csv.DictWriter(csvFile, fieldnames=fields)     # 建立Writer物件

    dictWriterObj.writeheader()   # 寫入標題
    dictWriterObj.writerow({'Name':'Hung', 'Age':'35', 'City':'Taipei'})
    dictWriterObj.writerow({'Name':'James', 'Age':'40', 'City':'Chicago'})

範例 pythonCSV-10.py : 將串列資料寫入CSV檔,而此串列資料的元素是字典

# pythonCSV-10.py
import csv

dictList = [{'Name':'Hung', 'Age':'35', 'City':'Taipei'},       # 定義串列,元素是字典
          {'Name':'James', 'Age':'40', 'City':'Chicago'}]
          
fileName = 'output-pythonCSV-10.csv'
with open(fileName, 'w', newline = '') as csvFile:      # 開啟csv檔案
    fields = ['Name', 'Age', 'City']
    dictWriter = csv.DictWriter(csvFile, fieldnames=fields)     # 建立Writer物件

    dictWriter.writeheader()      # 寫入標題
    for row in dictList:          # 寫入內容
        dictWriter.writerow(row)


參考資料

特色、摘要,Feature、Summary:

關鍵字、標籤,Keyword、Tag:

  • CSV,Python,Programming-Language,Data-Model,Python-Tutorial,

留言

這個網誌中的熱門文章

Ubuntu 常用指令、分類與簡介

iptables的觀念與使用

網路設定必要參數IP、netmask(遮罩)、Gateway(閘道)、DNS

了解、分析登錄檔 - log

Python 與SQLite 資料庫

Blogger文章排版範本

Pandas 模組

如何撰寫Shell Script

查詢指令或設定 -Linux 線上手冊 - man

下載網頁使用 requests 模組