Python 讀取與寫入CSV 檔案教學與範例 - G. T. Wang

文章推薦指數: 80 %
投票人數:10人

這裡介紹如何在Python 中使用 csv 模組,讀取與寫入逗點分隔檔。

... import csv # 開啟輸出的CSV 檔案 with open('output.csv', 'w', newline='') as ... Blogger舊站 關於 Facebook Flickr 物聯網 網站架設 程式設計 統計 素食 特價優惠 宗教 物聯網 網站架設 程式設計 統計 素食 特價優惠 宗教 Python讀取與寫入CSV檔案教學與範例 2018/03/22 8則留言 這裡介紹如何在Python中使用csv模組,讀取與寫入逗點分隔檔。

逗點分隔(Comma-SeparatedValues,簡稱csv)是一種簡單的文字檔格式,以逗號分隔不同欄位的資料,很多軟體在儲存與交換表格資料時都支援這樣的格式。

在Python中若要讀取或產生csv的檔案,可以使用內建的csv模組,以下是使用方式以及範例程式碼。

讀取CSV檔案 假設我們有一個csv檔案iris.csv,其內容如下: sepal_length,sepal_width,petal_length,petal_width,species 5.1,3.5,1.4,0.2,setosa 4.9,3,1.4,0.2,setosa 4.7,3.2,1.3,0.2,setosa 4.6,3.1,1.5,0.2,setosa [略] 我們可以使用下面這段程式碼將這個csv檔的內容讀取出來: importcsv #開啟CSV檔案 withopen('iris.csv',newline='')ascsvfile: #讀取CSV檔案內容 rows=csv.reader(csvfile) #以迴圈輸出每一列 forrowinrows: print(row) 我們使用csv.reader讀取出來的rows會是一個二維的list,裡面就是整張表格的資料,這裡我們把每一列的list直接輸出,執行後會像這樣: ['sepal_length','sepal_width','petal_length','petal_width','species'] ['5.1','3.5','1.4','0.2','setosa'] ['4.9','3','1.4','0.2','setosa'] ['4.7','3.2','1.3','0.2','setosa'] ['4.6','3.1','1.5','0.2','setosa'] [略] 這裡在開啟csv檔案時加上了newline=''參數,這是為了讓資料中包含的換行字元可以正確被解析,所以建議在讀取csv檔案時都固定加入這個參數。

指定分隔字元 如果資料欄位之間的分隔字元不是使用預設的逗號,而是其他字元的話,在讀取時就要自行指定欄位的分隔字元。

假設我們要讀取Linux的/etc/passwd這個檔案,資料如下: root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync [略] 這個檔案內容的各個欄位是以冒號(:)來分隔的,我們可以使用以下這段程式碼來讀取: importcsv withopen('/etc/passwd',newline='')ascsvfile: #以冒號分隔欄位,讀取檔案內容 rows=csv.reader(csvfile,delimiter=':') forrowinrows: print(row) 輸出如下: ['root','x','0','0','root','/root','/bin/bash'] ['daemon','x','1','1','daemon','/usr/sbin','/usr/sbin/nologin'] ['bin','x','2','2','bin','/bin','/usr/sbin/nologin'] ['sys','x','3','3','sys','/dev','/usr/sbin/nologin'] ['sync','x','4','65534','sync','/bin','/bin/sync'] [略] 讀取成Dictionary 我們也可以將csv檔案的內容讀取進來之後,轉為Python的dictionary格式,這樣在存取各定資料時會方便一些: importcsv withopen('iris.csv',newline='')ascsvfile: #讀取CSV檔內容,將每一列轉成一個dictionary rows=csv.DictReader(csvfile) #以迴圈輸出指定欄位 forrowinrows: print(row['sepal_length'],row['species']) 這個例子中我們使用以csv.DictReader來讀取CSV檔案的內容,它會自動把第一列(row)當作欄位的名稱,將第二列以後的每一列轉為dictionary,這樣我們就可以使用欄位的名稱來存取資料。

執行後的輸出會像這樣: 5.1setosa 4.9setosa 4.7setosa 4.6setosa 5setosa 寫入CSV檔案 如果我們在程式中產生了表格的資料,想要儲存為csv檔案,可以使用以下這段程式碼: importcsv #開啟輸出的CSV檔案 withopen('output.csv','w',newline='')ascsvfile: #建立CSV檔寫入器 writer=csv.writer(csvfile) #寫入一列資料 writer.writerow(['姓名','身高','體重']) #寫入另外幾列資料 writer.writerow(['令狐沖',175,60]) writer.writerow(['岳靈珊',165,57]) 產生的output.csv檔案內容會像這樣: 姓名,身高,體重 令狐沖,175,60 岳靈珊,165,57 指定分隔字元 輸出csv檔案時也可以自行指定欄位的分隔字元,例如: importcsv withopen('output.csv','w',newline='')ascsvfile: #以空白分隔欄位,建立CSV檔寫入器 writer=csv.writer(csvfile,delimiter='') writer.writerow(['姓名','身高','體重']) writer.writerow(['令狐沖',175,60]) writer.writerow(['岳靈珊',165,57]) 輸出的output.csv檔案內容會變成這樣: 姓名身高體重 令狐沖17560 岳靈珊16557 一次寫入二維表格 如果我們的資料是已經整理好的二維表格,也可以一次就把整張表格寫進csv檔案中: importcsv #二維表格 table=[ ['姓名','身高','體重'], ['令狐沖',175,60], ['岳靈珊',165,57] ] withopen('output.csv','w',newline='')ascsvfile: writer=csv.writer(csvfile) #寫入二維表格 writer.writerows(table) 這樣產生的csv檔案也會跟上面的例子相同。

寫入Dictionary 如果我們在Python中的資料格式是dictionary,也可以使用csv.DictWriter直接將dictionary寫入csv檔案中: importcsv withopen('output.csv','w',newline='')ascsvfile: #定義欄位 fieldnames=['姓名','身高','體重'] #將dictionary寫入CSV檔 writer=csv.DictWriter(csvfile,fieldnames=fieldnames) #寫入第一列的欄位名稱 writer.writeheader() #寫入資料 writer.writerow({'姓名':'令狐沖','身高':175,'體重':60}) writer.writerow({'姓名':'岳靈珊','身高':165,'體重':57}) 此範例輸出的檔案內容也跟上面的例子相同。

參考資料:Python2Document、Python3Document 程式設計 Python G.T.Wang 個人使用Linux經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

8留言 新增留言→ DT 請問一下,我將要載入的csv檔放置在跟python檔同一個資料夾下,但是卻出現FileNotFoundError的情況,要如何解決此問題呢? File“C:\Users\user\Desktop\reyopython\csv_reader.py”,line3,in withopen(‘result.csv’,newline=”)ascsvfile: FileNotFoundError:[Errno2]Nosuchfileordirectory:‘result.csv’ 2018/08/11 回覆 Passby 試試看”\result.csv” 或是放絕對路徑 “C:\Users\user\Desktop\reyopython\result.csv” 2018/09/07 回覆 Sam 請問我的程式要讀取的時候一直顯示 ‘csv’hasnoattribute’reader’ 要怎麼做 2020/09/22 回覆 Raines 嗨,我使用下面的code 不過一直出現 TypeError:‘_csv.reader’objectisnotcallable 請問一下是甚麼問題 importcsv #開啟CSV檔案 withopen(‘d:/Users/ChenR/Desktop/HHP/1810C35.dat’,newline=”)ascsvfile: #讀取CSV檔案內容 rows=csv.reader(csvfile) #以迴圈輸出每一列 forrowinrows: print(row) 2018/11/13 回覆 eric importcsv #開啟CSV檔案 withopen(‘d:\daDebug.ini’,newline=”)ascsvfile: rows=csv.reader(csvfile) #以迴圈輸出每一列 forrowinrows: print(row) 2020/04/27 回覆 hint python3newline=” python2open(csv_file,‘wb’) 2020/09/02 回覆 Neal 請問如果我讀取CSV檔案後要轉成excel格式輸出,可以怎麼做呢? 2021/01/12 回覆 Wen 令狐沖太瘦了,岳靈珊也太胖了吧XD 2021/08/19 回覆 LeaveaReply取消回覆 留言* Name* Email* Website 搜尋 分類Arduino(5) BeagleBoneBlack(1) DIY(54) Linux(317) macOS(33) Octave(15) Perl(12) R(47) Windows(98) WordPress(16) 個人(15) 免費(35) 兒童(30) 實用工具(85) 手機(13) 技巧(45) 有趣(99) 樹莓派(57) 物聯網(55) 玄學(11) 生活(209) 程式設計(137) 統計學(8) 網頁空間(36) 網頁開發(128) 虛擬化(7) 農業(42) 遊戲(9) 開箱(132) 雲端(4) 宗教 如何戒邪淫、遠離婚外情 戒淫寶典:《壽康寶鑑》白話有聲書 公益 社團法人新竹縣愛心物資集發協會 igiving公益網 台灣世界展望會 Yahoo奇摩公益 家扶基金會 ©2022G.T.Wang



請為這篇文章評分?