python3從零學習-5.5.1、CSV 文件讀寫

源代碼: Lib/csv.py

模塊內容
csv 模塊定義了以下函數:
  • csv.reader(csvfile, dialect='excel', **fmtparams)

返回一個 reader 對象,該對象將逐行遍歷 csvfilecsvfile 可以是任何對象,只要這個對象支持 iterator 協議並在每次調用 __next__() 方法時都返回字符串,文件對象 和列表對象均適用。如果 csvfile 是文件對象,則打開它時應使用 newline=''。 1 可選參數 dialect 是用於不同的 CSV 方言的特定參數組。它可以是 Dialect 類的子類的實例,也可以是 list_dialects() 函數返回的字符串之一。另一個可選關鍵字參數 fmtparams 可以覆寫當前方言格式中的單個格式設置。有關方言和格式設置參數的完整詳細信息,請參見 變種與格式參數 部分。
csv 文件的每一行都讀取爲一個由字符串組成的列表。除非指定了 QUOTE_NONNUMERIC 格式選項(在這種情況下,未引用的字段會轉換爲浮點數),否則不會執行自動數據類型轉換。
一個簡短的用法示例:
>>> 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 是文件對象,則打開它時應使用 newline=''。 1 可選參數 dialect 是用於不同的 CSV 方言的特定參數組。它可以是 Dialect 類的子類的實例,也可以是 list_dialects() 函數返回的字符串之一。另一個可選關鍵字參數 fmtparams 可以覆寫當前方言格式中的單個格式設置。有關方言和格式設置參數的完整詳細信息,請參見 變種與格式參數 部分。爲了儘量簡化與數據庫 API 模塊之間的對接,None 值會寫入爲空字符串。雖然這個轉換是不可逆的,但它讓 SQL 空數據值轉儲到 CSV 文件更容易,而無需預處理從 cursor.fetch* 調用返回的數據。寫入前,所有非字符串數據都先用 str() 轉化爲字符串再寫入。
一個簡短的用法示例:
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]])

將 name 與 dialect 關聯起來。name 必須是字符串。要指定變種 (dialect),可以給出 Dialect 的子類,或給出 fmtparams 關鍵字參數,或兩者都給出,此時關鍵字參數會覆蓋 dialect 參數。 有關變種和格式設置參數的完整詳細信息,請參見 變種與格式參數 部分。
  • csv.unregister_dialect(name)

從變種註冊表中刪除 name 對應的變種。如果 name 不是已註冊的變種名稱,則拋出 Error 異常。
  • csv.get_dialect(name)

返回 name 對應的變種。如果 name 不是已註冊的變種名稱,則拋出 Error 異常。該函數返回的是不可變的 Dialect 對象。
  • csv.list_dialects()

返回所有已註冊變種的名稱。
  • csv.field_size_limit([new_limit])

返回解析器當前允許的最大字段大小。如果指定了 new_limit,則它將成爲新的最大字段大小。
 
csv 模塊定義了以下類:

class csv.DictReader(ffieldnames=Nonerestkey=Nonerestval=Nonedialect='excel'*args**kwds)

創建一個對象,其操作類似於常規 reader 但會將每行中的信息映射到一個 OrderedDict,其中的鍵由可選的 fieldnames 形參給出。
fieldnames 形參是一個 sequence。 如果省略 fieldnames,則文件 f 第一行中的值將被用作字段名。 無論字段名是如何確定的,有序字典都將保留其原始順序。
If a row has more fields than fieldnames, the remaining data is put in a list and stored with the fieldname specified by restkey (which defaults to None). If a non-blank row has fewer fields than fieldnames, the missing values are filled-in with None.
所有其他可選或關鍵字參數都傳遞給底層的 reader 實例。
在 3.6 版更改: 返回的行現在的類型是 OrderedDict
一個簡短的用法示例:
>>> import csv
>>> with open('names.csv', newline='') as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])
...
Eric Idle
John Cleese
 
>>> print(row)
OrderedDict([('first_name', 'John'), ('last_name', 'Cleese')])
 

class csv.DictWriter(ffieldnamesrestval=''extrasaction='raise'dialect='excel'*args**kwds)

創建一個對象,該對象在操作上類似常規 writer,但能將字典映射到輸出行。fieldnames 參數是由 key(鍵)組成的 序列,用於指定字典中的 value (值)的順序,這些值會按指定順序傳遞給 writerow() 方法並寫入 f 文件。如果字典缺少 fieldnames 中的鍵,則可選參數 restval 用於指定要寫入的值。如果傳遞給 writerow() 方法的字典的某些鍵在 fieldnames 中找不到,則可選參數 extrasaction 用於指定要執行的操作。如果將其設置爲 'raise' (默認值),則會引發 ValueError。 如果將其設置爲 'ignore',則字典中的其他鍵值將被忽略。 所有其他可選或關鍵字參數都傳遞給底層的 writer 實例。
Note that unlike the DictReader class, the fieldnames parameter of the DictWriter is not optional. Since Python’s dict objects are not ordered, there is not enough information available to deduce the order in which the row should be written to file f.
一個簡短的用法示例:
import csv
 
with open('names.csv', 'w', newline='') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
 
    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
  • class csv.Dialect

Dialect 類是主要依賴於其屬性的容器類,用於將定義好的參數傳遞給特定的 reader 或 writer 實例。
  • class csv.excel

excel 類定義了 Excel 生成的 CSV 文件的常規屬性。它在變種註冊表中的名稱是 'excel'
  • class csv.excel_tab

excel_tab 類定義了 Excel 生成的、製表符分隔的 CSV 文件的常規屬性。它在變種註冊表中的名稱是 'excel-tab'
  • class csv.unix_dialect

unix_dialect 類定義了在 UNIX 系統上生成的 CSV 文件的常規屬性,即使用 '\n' 作爲換行符,且所有字段都有引號包圍。它在變種註冊表中的名稱是 'unix'
3.2 新版功能.
  • class csv.Sniffer

Sniffer 類用於推斷 CSV 文件的格式。
Sniffer 類提供了兩個方法:

sniff(sampledelimiters=None)

分析給定的 sample 並返回一個 Dialect 子類,該子類中包含了分析出的格式參數。如果給出可選的 delimiters 參數,則該參數會被解釋爲字符串,該字符串包含了可能的有效分隔符。

has_header(sample)

分析示例文本(假定爲 CSV 格式),如果第一行很可能是一系列列標題,則返回 True
使用 Sniffer 的示例:
with open('example.csv', newline='') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ...
 
csv 模塊定義了以下常量:
  • csv.QUOTE_ALL

指示 writer 對象給所有字段加上引號。
  • csv.QUOTE_MINIMAL

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

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

指示 writer 對象不使用引號引出字段。當 定界符 出現在輸出數據中時,其前面應該有 轉義符。如果未設置 轉義符,則遇到任何需要轉義的字符時,writer 都會拋出 Error 異常。
指示 reader 不對引號字符進行特殊處理。
csv 模塊定義了以下異常:

exception csv.Error

該異常可能由任何發生錯誤的函數拋出
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章