Python中CSV文件的讀寫(xiě)庫(kù)操作方法
CSV 格式的全稱(chēng)是 Comma Separated Values,意思是逗號(hào)分割的數(shù)據(jù),是最常見(jiàn)的電子表格和數(shù)據(jù)庫(kù)的導(dǎo)出格式之一,在 RFC 4180 中已經(jīng)成為了一種標(biāo)準(zhǔn)格式。Python 中提供了一個(gè)官方的標(biāo)準(zhǔn)庫(kù)來(lái)處理這種文件類(lèi)型,那就是 CSV 庫(kù)。
官方文檔在此:CSV
文件的基本讀寫(xiě)
文件的讀寫(xiě)主要使用 csv.reader
和 csv.writer
來(lái)完成,它的定義如下:
csv.reader(csvfile, dialect='excel', **fmtparams)
csvfile
:返回字符串的迭代器,一般是open
函數(shù)返回的文件對(duì)象dialect
:用來(lái)讀取非標(biāo)準(zhǔn) csv 格式的指定參數(shù),這部分參考下文**fmtparams
:用來(lái)指定格式的參數(shù),這部分的詳細(xì)參數(shù)參考下文
最簡(jiǎn)單、最常用的使用方法是將 open
函數(shù)返回的文件對(duì)象直接丟給 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
類(lèi)似地,對(duì)文件的寫(xiě)操作與原生方法類(lèi)似:
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
:可迭代對(duì)象或者文件對(duì)象fieldnames
:一個(gè)有序列表,代表字典中的字段(一般是文件的列名),如果不指定,就用文件的第一行的字符串來(lái)作為字段的名字restkey
:如果列名的數(shù)量少于內(nèi)容的列數(shù),那么剩下的列就會(huì)被統(tǒng)一放到一個(gè)字段里,這里的restkey
就是這個(gè)字段的名字,默認(rèn)為None
restval
:與restkey
類(lèi)似,如果內(nèi)容的列數(shù)少于列名的數(shù)量,那么內(nèi)容中缺少的列就會(huì)被填充,這個(gè)參數(shù)指定用來(lái)填充的值,默認(rèn)為None
- 其他的參數(shù)與
csv.reader
相同
一個(gè)簡(jiǎn)單的示例如下:
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'}
類(lèi)似地,字典的寫(xiě)通過(guò) csv.DictWriter
來(lái)完成,這個(gè)函數(shù)將字典類(lèi)型的數(shù)據(jù)輸出為表格形式的數(shù)據(jù),csv.DictWriter
的參數(shù)如下:
csv.DictWriter( f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds )
與 csv.DictWriter
類(lèi)似,fieldnames
指定所有的字段名稱(chēng),restval
用來(lái)指定當(dāng)指定字段有缺失值的時(shí)候用來(lái)填充的內(nèi)容,extrasaction
參數(shù)用來(lái)指定內(nèi)容缺少字段時(shí)的操作,默認(rèn)會(huì) 'raise'
,即引發(fā)一個(gè) ValueError
異常,可以設(shè)置為 'ignore'
,對(duì)應(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 文件,無(wú)法直接讀取,這時(shí)候我們需要指定一些額外參數(shù)來(lái)處理這些情況,這種情況下需要用到 dialect
功能,這個(gè)功能包含若干類(lèi)和若干函數(shù)來(lái)幫助我們實(shí)現(xiàn)我們的目的。
dialect
默認(rèn)情況下,三個(gè) dialect 類(lèi)型是內(nèi)置的,分別是 'unix'
、'excel'
、和 'excel_tab'
。'unix'
模式用來(lái)處理在 Unix 系統(tǒng)下生成的文件,而 'excel'
模式用來(lái)處理 excel 生成的 csv 文件,最后的 'excel_tab'
用來(lái)處理 excel 生成的制表符分割的文件,這三種預(yù)設(shè)已經(jīng)覆蓋了絕大多數(shù)的使用場(chǎng)景。
用戶可以使用 Dialect 類(lèi)來(lái)自定格式的處理:
csv.register_dialect( 'unixpwd', delimiter=',', quoting=csv.QUOTE_MINIMAL, quotechar='"', doublequote=True, escapechar=None, lineterminator='\r\n', skipinitialspace=False, strict=False )
name
:自定義的格式名稱(chēng)delimiter
:用來(lái)分割各字段的字符,默認(rèn)為,
doublequote
:沒(méi)啥用,看不懂,待補(bǔ)充escapechar
:沒(méi)啥用,一般不用lineterminator
:換行符,默認(rèn)是'\r\n'
quotechar
:當(dāng)字段含有特殊字符是,用來(lái)引用的符號(hào),默認(rèn)是"
,不用改,不常用quoting
:加引號(hào)的行為,可以選擇QUOTE_ALL
、QUOTE_MINIMAL
、QUOTE_NONNUMERIC
、QUOTE_NONE
四種行為skipinitialspace
:是否跳過(guò)分隔符后面的空格,默認(rèn)為False
strict
:嚴(yán)格模式,如果為 True,文件格式不對(duì)的時(shí)候會(huì)報(bào)錯(cuò)終止,否則會(huì)強(qiáng)制讀取
使用方法就是先使用csv.register_dialect
注冊(cè)一個(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
提供了對(duì)格式的自動(dòng)檢測(cè),并輸出一個(gè) dialect
,提供了兩個(gè)函數(shù),分別是 has_header
,用來(lái)檢測(cè)文件是否包含標(biāo)題行,和主函數(shù) sniff
,這里通過(guò)一個(gè)例子來(lái)學(xué)習(xí)它的使用:
with open('example.csv', newline='') as csvfile: # 通過(guò)文件的前1024行來(lái)確定文件的格式規(guī)范 dialect = csv.Sniffer().sniff(csvfile.read(1024)) # 將指針重置,從文件開(kāi)始進(jìn)行讀取 csvfile.seek(0) reader = csv.reader(csvfile, dialect) # ... process CSV file contents here ..
到此這篇關(guān)于Python中CSV文件的讀寫(xiě)庫(kù)的文章就介紹到這了,更多相關(guān)CSV文件的讀寫(xiě)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pycharm與jupyter?lab/notebook結(jié)合使用方式
這篇文章主要介紹了pycharm與jupyter?lab/notebook結(jié)合使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06windows+vscode安裝paddleOCR運(yùn)行環(huán)境的步驟
這篇文章主要介紹了windows+vscode安裝paddleOCR運(yùn)行環(huán)境,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Python使用爬蟲(chóng)抓取美女圖片并保存到本地的方法【測(cè)試可用】
這篇文章主要介紹了Python使用爬蟲(chóng)抓取美女圖片并保存到本地的方法,涉及Python基于正則、爬蟲(chóng)實(shí)現(xiàn)的圖片抓取與保存相關(guān)操作技巧,需要的朋友可以參考下2018-08-08一文詳細(xì)介紹Python中的OrderedDict對(duì)象
OrderedDict是Python標(biāo)準(zhǔn)庫(kù)collections模塊的一部分,下面這篇文章主要給大家介紹了關(guān)于Python中OrderedDict對(duì)象的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08淺談keras的深度模型訓(xùn)練過(guò)程及結(jié)果記錄方式
今天小編就為大家分享一篇淺談keras的深度模型訓(xùn)練過(guò)程及結(jié)果記錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01基于Python實(shí)現(xiàn)千圖成像工具的示例代碼
千圖成像也就是用N張圖片組成一張圖片的效果。這篇文章將利用Python語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)單的千圖成像工具,感興趣的小伙伴可以了解一下2022-07-07