網(wǎng)站首頁 編程語言 正文
CSV 格式的全稱是 Comma Separated Values,意思是逗號(hào)分割的數(shù)據(jù),是最常見的電子表格和數(shù)據(jù)庫的導(dǎo)出格式之一,在?RFC 4180?中已經(jīng)成為了一種標(biāo)準(zhǔn)格式。Python 中提供了一個(gè)官方的標(biāo)準(zhǔn)庫來處理這種文件類型,那就是 CSV 庫。
官方文檔在此:CSV
文件的基本讀寫
文件的讀寫主要使用?csv.reader
?和?csv.writer
?來完成,它的定義如下:
csv.reader(csvfile, dialect='excel', **fmtparams)
-
csvfile
:返回字符串的迭代器,一般是?open
?函數(shù)返回的文件對象 -
dialect
:用來讀取非標(biāo)準(zhǔn) csv 格式的指定參數(shù),這部分參考下文 -
**fmtparams
:用來指定格式的參數(shù),這部分的詳細(xì)參數(shù)參考下文
最簡單、最常用的使用方法是將?open
?函數(shù)返回的文件對象直接丟給?csv.reader
?就會(huì)得到一個(gè)每次返回一個(gè)拆分后的字符串列表的迭代器:
import csv with open('file.csv', 'r') as input_file: file_content = csv.reader(input_file, delemiter=',') for row in file_content: # code here pass
類似地,對文件的寫操作與原生方法類似:
import csv with open('file.csv', 'w', newline='') as output_file: file_writer = csv.writer(output_file, delimiter=',') file_writer.writerow(['Spam'] * 5 + ['Baked Beans']) file_writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
用字典模式處理數(shù)據(jù)
有時(shí)候,我們可能需要將數(shù)據(jù)讀取成字典(例如要上傳到 MongoDB 的時(shí)候),這時(shí)候我們可以使用?csv.DictReader
?將表格形式的數(shù)據(jù)讀取為字典形式的數(shù)據(jù)。
這個(gè)函數(shù)的參數(shù)如下:
csv.DictReader( f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds )
-
f
:可迭代對象或者文件對象 -
fieldnames
:一個(gè)有序列表,代表字典中的字段(一般是文件的列名),如果不指定,就用文件的第一行的字符串來作為字段的名字 -
restkey
:如果列名的數(shù)量少于內(nèi)容的列數(shù),那么剩下的列就會(huì)被統(tǒng)一放到一個(gè)字段里,這里的?restkey
?就是這個(gè)字段的名字,默認(rèn)為?None
-
restval
:與?restkey
?類似,如果內(nèi)容的列數(shù)少于列名的數(shù)量,那么內(nèi)容中缺少的列就會(huì)被填充,這個(gè)參數(shù)指定用來填充的值,默認(rèn)為?None
- 其他的參數(shù)與?
csv.reader
?相同
一個(gè)簡單的示例如下:
import csv with open('file.csv') as input_file: reader = csv.DictReader(input_file) for row in reader: print(row['first_name'], row['last_name']) # Eric Idle # John Cleese print(row) # {'first_name': 'John', 'last_name': 'Cleese'}
類似地,字典的寫通過?csv.DictWriter
?來完成,這個(gè)函數(shù)將字典類型的數(shù)據(jù)輸出為表格形式的數(shù)據(jù),csv.DictWriter
?的參數(shù)如下:
csv.DictWriter( f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds )
與?csv.DictWriter
?類似,fieldnames
?指定所有的字段名稱,restval
?用來指定當(dāng)指定字段有缺失值的時(shí)候用來填充的內(nèi)容,extrasaction
?參數(shù)用來指定內(nèi)容缺少字段時(shí)的操作,默認(rèn)會(huì)?'raise'
,即引發(fā)一個(gè)?ValueError
?異常,可以設(shè)置為?'ignore'
,對應(yīng)著忽略額外值,一個(gè)示例如下:
import csv with open('names.csv', 'w', newline='') as output_file: fieldnames = ['first_name', 'last_name'] writer = csv.DictWriter(output_file, 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'})
非標(biāo)準(zhǔn)格式的處理
有時(shí)候,csv 的文件可能不是標(biāo)準(zhǔn)的 csv 文件,無法直接讀取,這時(shí)候我們需要指定一些額外參數(shù)來處理這些情況,這種情況下需要用到?dialect
?功能,這個(gè)功能包含若干類和若干函數(shù)來幫助我們實(shí)現(xiàn)我們的目的。
dialect
默認(rèn)情況下,三個(gè) dialect 類型是內(nèi)置的,分別是?'unix'
、'excel'
、和?'excel_tab'
。'unix'
?模式用來處理在 Unix 系統(tǒng)下生成的文件,而?'excel'
?模式用來處理 excel 生成的 csv 文件,最后的?'excel_tab'
?用來處理 excel 生成的制表符分割的文件,這三種預(yù)設(shè)已經(jīng)覆蓋了絕大多數(shù)的使用場景。
用戶可以使用 Dialect 類來自定格式的處理:
csv.register_dialect( 'unixpwd', delimiter=',', quoting=csv.QUOTE_MINIMAL, quotechar='"', doublequote=True, escapechar=None, lineterminator='\r\n', skipinitialspace=False, strict=False )
-
name
:自定義的格式名稱 -
delimiter
:用來分割各字段的字符,默認(rèn)為?,
-
doublequote
:沒啥用,看不懂,待補(bǔ)充 -
escapechar
:沒啥用,一般不用 -
lineterminator
:換行符,默認(rèn)是?'\r\n'
-
quotechar
:當(dāng)字段含有特殊字符是,用來引用的符號(hào),默認(rèn)是?"
,不用改,不常用 -
quoting
:加引號(hào)的行為,可以選擇?QUOTE_ALL
、QUOTE_MINIMAL
、QUOTE_NONNUMERIC
、QUOTE_NONE
?四種行為 -
skipinitialspace
:是否跳過分隔符后面的空格,默認(rèn)為?False
-
strict
:嚴(yán)格模式,如果為 True,文件格式不對的時(shí)候會(huì)報(bào)錯(cuò)終止,否則會(huì)強(qiáng)制讀取
使用方法就是先使用csv.register_dialect
注冊一個(gè)自定義dialect,然后在reader里面指定它:
import csv csv.register_dialect( 'unixpwd', delimiter=':', quoting=csv.QUOTE_NONE, ... ) with open('passwd', newline='') as f: reader = csv.reader(f, 'unixpwd')
Sniffer
正如它的名字,sniffer
?提供了對格式的自動(dòng)檢測,并輸出一個(gè)?dialect
,提供了兩個(gè)函數(shù),分別是?has_header
,用來檢測文件是否包含標(biāo)題行,和主函數(shù)?sniff
,這里通過一個(gè)例子來學(xué)習(xí)它的使用:
with open('example.csv', newline='') as csvfile: # 通過文件的前1024行來確定文件的格式規(guī)范 dialect = csv.Sniffer().sniff(csvfile.read(1024)) # 將指針重置,從文件開始進(jìn)行讀取 csvfile.seek(0) reader = csv.reader(csvfile, dialect) # ... process CSV file contents here ..
原文鏈接:https://www.cnblogs.com/wdyyy/p/python_csv.html
相關(guān)推薦
- 2022-04-25 Entity?Framework?Core生成列并跟蹤列記錄_實(shí)用技巧
- 2022-11-20 利用Go語言快速實(shí)現(xiàn)一個(gè)極簡任務(wù)調(diào)度系統(tǒng)_Golang
- 2022-08-17 WPF實(shí)現(xiàn)Interaction框架的Behavior擴(kuò)展_C#教程
- 2021-12-03 前端異常502?bad?gateway的原因和解決辦法_nginx
- 2022-04-15 python中對正則表達(dá)式re包的簡單引用方式_python
- 2022-10-26 Go?語言數(shù)據(jù)結(jié)構(gòu)之雙鏈表學(xué)習(xí)教程_Golang
- 2022-11-30 ASP.NET?MVC實(shí)現(xiàn)本地化和全球化_實(shí)用技巧
- 2022-07-07 Python?pluggy模塊的用法示例演示_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支