Python學習:csv模塊

簡介

csv格式(Comma Separated Vaules)是電子表格與數據庫數據中最常見的輸入、輸出文件格式。在RFC 4180規範推出之前很多年,csv格式文件就已經開始使用了。由於沒有合理的標準,不用的應用程序生成的csv格式文件會存在細微的差別,這種差別會導致不同來源的csv格式文件的處理麻煩。但是儘管csv格式中的分隔符會變化,csv格式文件的大致格式是相似的,所以編寫一個單獨的模塊來高效地處理此類數據,將程序員從讀寫數據的繁瑣細節中解放出來,是有意義的。

csv模塊實現了 csv格式表單數據的讀寫。其提供了諸如“以兼容 Excel 的方式輸出數據文件”或“讀取 Excel 程序輸出的數據文件”的功能,程序員無需知道 Excel 所採用 csv格式的細節。此模塊同樣可以用於定義其他應用程序可用的 csv格式或定義特定需求的 csv格式。

模塊內容

csv模塊定義了以下的函數:

csv.reader(csvfile, dialect='excel', **fmtparams)
#方法返回一個reader對象,該對象可逐行遍歷csvfile
#csvfile可以是支持迭代遍歷,具有__next__方法的任何對象
#file對象,list對象都是合適的csvfile
#如果csvfile是file對象,則該file對象需使用參數 newline='' 打開
#可選參數dialect是用於不同的csv變種的特定參數組
#可選關鍵字參數fmtparams可以覆寫當前變種格式中的單個格式設置
#從csv文件讀取的內容以字符串列表的方式返回
#一個簡單的例子
>>> 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

csv.writer(csvfile, dialect='excel', **fmtparams)
#返回一個 writer 對象,該對象負責將用戶的數據在給定的文件類對象上轉換爲帶分隔符的字符串
#csvfile可以是具有write方法的任何對象
#如果csvfile是file對象,則該file對象需使用參數 newline='' 打開
#一個簡單的例子
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'])
    
csv.register_dialect(name[, dialect[, **fmtparams]])
#方法將dialect與name聯繫起來,name必須是字符串
#可以通過傳遞一個Dialect類的子類,或者關鍵字參數fmtparams,來確定dialect

csv.unregister_dialect(name)
#刪除dialect與name的聯繫

csv.get_dialect(name)
#通過name獲取dialect,方法返回不可變的Dialect對象

csv.list_dialects()
#返回已經註冊的dialect列表
>>> import csv
>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']
>>>

csv.field_size_limit([new_limit])
#返回解析器當前允許的最大字段大小。如果指定了 new_limit,則它將成爲新的最大字段大小

csv模塊定義了以下的類:

class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
#創建一個對象,該對象在操作上類似於常規 reader,
#但是將每行中的信息映射到一個 dict,該 dict 的鍵由 fieldnames 可選參數給出
#參數fieldnames是序列,如果省略fieldnames,則文件 f 第一行中的值將用作字段名
#如果某一行中的字段多於字段名,則其餘字段將放入列表中,字段名由 restkey 指定(默認爲 None)
#如果非空白行的字段少於字段名,則缺少的值將用 None 填充

class csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
#創建一個對象,該對象在操作上類似常規 writer,但會將字典映射到輸出行
#fieldnames 參數是由鍵組成的 序列,它指定字典中值的順序
#這些值會按指定順序傳遞給 writerow() 方法並寫入文件 f
#如果字典缺少 fieldnames 中的鍵,則可選參數 restval 用於指定要寫入的值
#如果傳遞給 writerow() 方法的字典的某些鍵在 fieldnames 中找不到
#則可選參數 extrasaction 用於指定要執行的操作
#如果將其設置爲默認值 'raise',則會引發 ValueError
#如果將其設置爲 'ignore',則字典中的其他鍵值將被忽略

csv模塊定義了以下的常量:

csv.QUOTE_ALL
#指示 writer 對象給所有字段加上引號

csv.QUOTE_MINIMAL
#指示 writer 對象僅爲包含特殊字符(例如 定界符、引號字符 或 行結束符 中的任何字符)的字段加上引號

csv.QUOTE_NONNUMERIC
#指示 writer 對象爲所有非數字字段加上引號
#指示 reader 將所有未用引號引出的字段轉換爲 float 類型

csv.QUOTE_NONE
#指示 writer 對象不使用引號引出字段
#指示 reader 不對引號字符進行特殊處理

變種與格式參數

爲了更加容易指定輸入與輸出記錄的格式,特定的一組格式參數組合爲一個dialect。一個dialect是一個Dialect類的子類。創建reader或者writer對象時,可以將某個字符串或者Dialect類的子類指定爲dialect參數。

Dialect類支持的屬性包括:

Dialect.delimiter
#一個用於分隔字段的單字符,默認爲 ','

Dialect.doublequote
#控制出現在字段中的引號字符應該如何被引出
#當該屬性爲True,則雙寫引號字符
#當該屬性爲False,則在引號字符前放置轉義符
#如果該屬性爲False,且轉義符未指定,則會引出Error異常

Dialect.escapechar
#指定轉義字符

Dialect.lineterminator
#放在 writer 產生的行的結尾,默認爲 '\r\n'

Dialect.quotechar
#一個單字符,用於包住含有特殊字符的字段,特殊字符如 定界符 或 引號字符 或換行符。默認爲 '"'

如果某個csv格式文件中,各個字段的分隔符不是默認的逗號,比如是“|”,則需要創建新的dialect,通過該新的dialect來讀取csv文件。

import csv

csv.register_dialect('pipes', delimiter = '|')

with open('testdata.csv', 'r') as f:
    reader = csv.reader(f, dialect = 'pipes')
    for row in reader:
        print(row)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章