csv 模塊負責讀取和寫入逗號分隔的文件csv(comma separated files)。
csv 文件一般是從電子表格程序(spreadsheets)或者數據庫(databases)導出來的文本格式的文件。它包含很多記錄(records)和字段(fields)。記錄是指一行數據,它由不同的字段構成,字段之間用逗號分隔。
讀取(Reading)
執行:
查看輸出,把每行記錄轉換成了字符串序列。
reader() 的第一個參數是使用 open() 函數打開的文件對象,也可以是可迭代的對象。這裡是一個文件對象。
文件 user.csv 是一個 csv 文件。使用 cat 命令查看它的內容,有三行,就是有三條記錄,每行有四個字段,用逗號隔開,第一行是每個字段的說明。
解析器會處理字符串內的換行符,我們新建一個文件 user-linebreak.csv,文件內容如下:
執行:
查看輸出,字段內的換行符也能被正確的解析。
寫入(Writing)
寫入csv文件和讀取一樣簡單,使用 writer() 函數獲取一個寫入對象,然後調用對象的 writerow() 方法。
執行:
寫入完成後,最後打印了文件的內容。
引用(Quoting)
上面的例子中,生成的字段沒有引號,默認 writer() 函數的行為是不會加的。可以傳入第二個參數更改默認行為。
第二個參數 quoating,傳入 QUOTE_NONNUMERIC,不是數字的字段加引號。
有4個不同的引用(quoting)選項,他們是定義在 csv 模塊裡的常量(constants):
- QUOTE_ALL 不管什麼類型,都加引用
- QUOTE_MINIMAL 智能為字段加引用,這個默認的選項
- QUOTE_NONNUMERIC 不是整數或者浮點數,加引用
- QUOTE_NONE 不引用任何字段
方言(Dialects)
因為 csv 格式沒有標準,所以解析器需要更加的靈活(flexible),靈活性(flexibility)意味著有一些參數可以控制解析器的行為,控制他們怎麼讀取數據和寫入數據。這些參數組裝到一個對象 dialect 中,只需要調用 reader() 和 writer() 函數的時候傳入 dialect 對象。
Python 標準庫定義了3中方言,可以通過函數 list_dialects() 查看。
excel 可以用於 Microsoft Excel 導出的格式,或者是 LibreOffice 導出的。
unix 使用雙引號包含所有的字段,換行符 '\n' 作為分隔符。
創建方言(Dialects)
也可以不用逗號分隔字段,例如可以使用管道符 | 分隔:
我們需要創建一個方言,然後標明使用字段分隔符(delimiter)為 |
執行:
使用 register_dialect() 函數創建了方言 pipes,使用字段分隔符 |,成功讀取了文件。
方言的參數
方言(dialect)指定了所有的標記用來解析文件,下面列舉了方言的所有標記:
- delimiter 字段分隔符,默認為 ,(fields separator)
- doublequote 字段是否使用雙引號,默認為 True
- escapechar 轉義字符,默認為 None
- lineterminator 行分隔符,默認為回車換行 \r\n
- quotechar 包圍字段的單字符,默認為 ''
- quoting 字段引用,上面有描述,默認為 QUOTE_MINIMAL
- skipinitalspace 是否忽略字段分隔符後的空白,默認為 False
使用字段名稱
默認使用 reader() 函數返回的是一個列表,csv 模塊提供了 DictReader 和 DictWriter 使返回的每一條記錄變成一個字典,方便訪問。字典的鍵可以傳入,也可以使用文件的第一行作為鍵。
執行:
默認 DictReader 使用第一行作為字典的鍵(key)。
使用 DictWriter 時,必須要提供一個字段名稱的序列。它才能知道數據怎麼在文件中排序。
執行:
初始化 DictWriter 時,傳入字段序列 fieldnames,然後使用 writeheader()方法寫入標題,最後寫入數據,writerow() 函數接收的是一個對象。
閱讀更多 趣喜歡編程 的文章