Python中CSV文件的讀寫庫操作方法
CSV 格式的全稱是 Comma Separated Values,意思是逗號分割的數(shù)據(jù),是最常見的電子表格和數(shù)據(jù)庫的導(dǎo)出格式之一,在 RFC 4180 中已經(jīng)成為了一種標(biāo)準(zhǔn)格式。Python 中提供了一個官方的標(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 就會得到一個每次返回一個拆分后的字符串列表的迭代器:
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ù)據(jù)讀取成字典(例如要上傳到 MongoDB 的時候),這時候我們可以使用 csv.DictReader 將表格形式的數(shù)據(jù)讀取為字典形式的數(shù)據(jù)。
這個函數(shù)的參數(shù)如下:
csv.DictReader(
f,
fieldnames=None,
restkey=None, restval=None,
dialect='excel',
*args, **kwds
)f:可迭代對象或者文件對象fieldnames:一個有序列表,代表字典中的字段(一般是文件的列名),如果不指定,就用文件的第一行的字符串來作為字段的名字restkey:如果列名的數(shù)量少于內(nèi)容的列數(shù),那么剩下的列就會被統(tǒng)一放到一個字段里,這里的restkey就是這個字段的名字,默認(rèn)為Nonerestval:與restkey類似,如果內(nèi)容的列數(shù)少于列名的數(shù)量,那么內(nèi)容中缺少的列就會被填充,這個參數(shù)指定用來填充的值,默認(rèn)為None- 其他的參數(shù)與
csv.reader相同
一個簡單的示例如下:
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 來完成,這個函數(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)指定字段有缺失值的時候用來填充的內(nèi)容,extrasaction 參數(shù)用來指定內(nèi)容缺少字段時的操作,默認(rèn)會 'raise',即引發(fā)一個 ValueError 異常,可以設(shè)置為 'ignore',對應(yīng)著忽略額外值,一個示例如下:
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)格式的處理
有時候,csv 的文件可能不是標(biāo)準(zhǔn)的 csv 文件,無法直接讀取,這時候我們需要指定一些額外參數(shù)來處理這些情況,這種情況下需要用到 dialect 功能,這個功能包含若干類和若干函數(shù)來幫助我們實現(xiàn)我們的目的。
dialect
默認(rèn)情況下,三個 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:沒啥用,看不懂,待補充escapechar:沒啥用,一般不用lineterminator:換行符,默認(rèn)是'\r\n'quotechar:當(dāng)字段含有特殊字符是,用來引用的符號,默認(rèn)是",不用改,不常用quoting:加引號的行為,可以選擇QUOTE_ALL、QUOTE_MINIMAL、QUOTE_NONNUMERIC、QUOTE_NONE四種行為skipinitialspace:是否跳過分隔符后面的空格,默認(rèn)為Falsestrict:嚴(yán)格模式,如果為 True,文件格式不對的時候會報錯終止,否則會強制讀取
使用方法就是先使用csv.register_dialect注冊一個自定義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 提供了對格式的自動檢測,并輸出一個 dialect,提供了兩個函數(shù),分別是 has_header,用來檢測文件是否包含標(biāo)題行,和主函數(shù) sniff,這里通過一個例子來學(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 ..到此這篇關(guān)于Python中CSV文件的讀寫庫的文章就介紹到這了,更多相關(guān)CSV文件的讀寫庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pycharm與jupyter?lab/notebook結(jié)合使用方式
這篇文章主要介紹了pycharm與jupyter?lab/notebook結(jié)合使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
windows+vscode安裝paddleOCR運行環(huán)境的步驟
這篇文章主要介紹了windows+vscode安裝paddleOCR運行環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Python使用爬蟲抓取美女圖片并保存到本地的方法【測試可用】
這篇文章主要介紹了Python使用爬蟲抓取美女圖片并保存到本地的方法,涉及Python基于正則、爬蟲實現(xiàn)的圖片抓取與保存相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
一文詳細(xì)介紹Python中的OrderedDict對象
OrderedDict是Python標(biāo)準(zhǔn)庫collections模塊的一部分,下面這篇文章主要給大家介紹了關(guān)于Python中OrderedDict對象的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
淺談keras的深度模型訓(xùn)練過程及結(jié)果記錄方式
今天小編就為大家分享一篇淺談keras的深度模型訓(xùn)練過程及結(jié)果記錄方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

