1. 程式人生 > >【Python內建包】csv模組用法

【Python內建包】csv模組用法

一、概述

CSV(逗號分隔符)檔案是表格與資料庫操作之中最常用的輸入輸出格式。在RFC4180中的檔案描述標準對CSV格式進行規範之前,CSV格式檔案就已經被應用了很多年了。而缺乏合適的格式描述規範意味著不同應用的輸入輸出格式會有著細微的差別。因此在從不同源生成這些檔案的時候,這些差別相當惱人。但是儘管不同規範的CSV之中,分隔符和引用符千差萬別,他們的格式還是大體相似的,因此製作一個可以高效處理(manipulate)csv檔案中的資料同時還能將讀寫的細節隱去的模組並不是什麼難事兒。
Python中的CSV模組之中實現了讀寫CSV格式檔案的一些類,他可以讓你的程式以一種更容易被Excel處理的格式來輸出或者讀入資料,而不必糾結於CSV檔案的一些麻煩的小細節。而且CSV模組可以讓你更自由的定製你想要的CSV格式檔案。

二、類與方法簡介

1.資料讀取

csv.reader(csvfile, dialect=’excel’, **fmtparams)
他是讀取CSV檔案時最常用的方法
他的csvfile引數需要一個檔案型別的物件,比如:

fileObj = open('E:/inputFile.csv','r')
csvReader = csv.reader(fileObj)

那麼這個方法返回的csvReader就是一個可以按行讀取檔案的物件。

An optional dialect parameter can be given which is used to define a set of parameters specific to a particular CSV dialect.

其實這個看你想以什麼規範操作csv檔案,可選的引數有三個,分別是excel,excel-tab和unix,基本用不著該這個引數。
而至於fmtparams包含的可選引數就得好好說道說道了。

delimiter

這個引數是用來指明分割符的,多數csv檔案的分隔符是英文逗號,但是萬一有檔案整點么蛾子咋整,比如把英文冒號當分割符,那就要把這個引數指明為:delimiter=’:’

quotechar

這個引數指明瞭引用符是啥,什麼是引用符呢,舉個例子,正常情況下,我們的csv之中的一行可能是這個樣子的:

abc,bcd,cde

用excel開啟,就像這樣
這裡寫圖片描述
這沒啥問題
但是萬一你的csv檔案的每有一個表格裡記錄的是:

ab,c

用excel開啟,就像這樣
這裡寫圖片描述
這就出事兒了,因為csv當你的一個表格內出現了一個英文逗號,而此時你的分隔符也恰好是英文逗號,那把這玩意關了在開啟,那最後豈不是會變成了
這裡寫圖片描述
這樣,為了防止這種情況發生,就需要用引用符了,我們把ab,c用雙引號括起來,告訴程式,這個“ab,c”是一個整體,不許拆分,就可以了。而因此,你可以傳入quotechar=’xxx’來定義你自己的引用符。

quoting

他的功能是指明瞭引用的模式,首先說,他可以接受幾種引數,長得像csv.QUOTE_的引數都可以傳進去,比如說csv.QUOTE_NONE,就是告訴程式,我的csv檔案裡不存在引用符,也就是說,所有的逗號都當做分隔符,不管他在不在引用符裡面。

doublequote

那麼萬一我們的一個表格裡本身就即包括一個英文逗號又包括一個雙引號,而恰好你的分隔符是英文都好,而引用符也是英文雙引號,這不又出事兒了麼,就好比,假如你的一個行長這樣,
這裡寫圖片描述
由於第二列裡有一個逗號,那就要用引用符把這個東西包起來,而裡面又有一個雙引號,那這時候匹配雙引號的時候就會出錯了,而為了防止這種問題的產生,我們在檔案編輯的時候,可以把引用符之中的雙引號重複一次,用來代表:這個表格裡出現了一次雙引號,比如用記事本開啟的時候,像這樣
這裡寫圖片描述
這樣在csvReader讀取檔案的時候,他如果碰到了在引用符之中的引用符,會吧連續的兩個引用符看做一個雙引用符。也就是說用csvReader讀取的時候,讀取的結果就是會就是
這裡寫圖片描述
看吧,沒錯了吧

escapechar

doublequote提供了一種,解決如果引用符裡出現引用符問題的檔案規範,而你也可以自己搞一套解決方案,誰說必須要重複一次啊,煩不煩啊,我就不想敲兩次,於是我把doublequote這個引數指定為False,但是還是要必須指定點啥玩意來完成這個功能的。這就是這個引數的功能。比如說當我們吧這個引數指定為escapechar=’:’,而當我們的輸入檔案為
這裡寫圖片描述
那麼在用csvReader讀取的時候,由於第二個引號有一個冒號字首,那麼讀取的時候就會認為,第二個冒號是這個表格內就存在的冒號,不是作為分割符存在的。讀取結果與上一個結果一樣的。

在使用reader的時候後,示例程式碼如下

>>> import csv
>>> with open('eggs.csv', newline='') as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

2.資料寫入

csv.writer(csvfile, dialect=’excel’, **fmtparams)
關鍵引數與之前一樣,反過來理解就好了
寫入示例程式碼如下

import csv
with open('eggs.csv', 'w', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])