Python中CSV文件處理全攻略
一、CSV 格式簡介
CSV 格式是一種以純文本形式存儲(chǔ)表格數(shù)據(jù)的文件格式,用特定分隔符(通常是逗號(hào))隔開不同字段。例如,一條包含姓名、年齡和城市的記錄,在 CSV 文件中可能表示為"Alice,25,New York"。雖然 CSV 格式被廣泛應(yīng)用,但由于缺乏統(tǒng)一標(biāo)準(zhǔn),不同應(yīng)用程序生成的 CSV 文件在格式細(xì)節(jié)上可能存在差異,這給數(shù)據(jù)處理帶來了挑戰(zhàn)。不過,其大致結(jié)構(gòu)相似,使得編寫通用處理模塊成為可能。
二、csv模塊核心內(nèi)容
(一)模塊函數(shù)
csv.reader(csvfile, dialect='excel', \**fmtparams):該函數(shù)用于創(chuàng)建一個(gè)reader對(duì)象,從給定的csvfile中讀取數(shù)據(jù)。csvfile可以是文件對(duì)象或包含字符串的可迭代對(duì)象,打開文件時(shí)需設(shè)置newline=''。dialect參數(shù)指定 CSV 變種,默認(rèn)為'excel',也可通過list_dialects()函數(shù)獲取已注冊變種名稱或自定義Dialect子類實(shí)例來設(shè)置。fmtparams用于覆蓋當(dāng)前變種的單個(gè)格式參數(shù)。例如:
import csv
with open('eggs.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
for row in spamreader:
print(', '.join(row))
- csv.writer(csvfile, dialect='excel', \**fmtparams):返回一個(gè)writer對(duì)象,將數(shù)據(jù)轉(zhuǎn)換為帶分隔符的字符串寫入csvfile。csvfile需具有write()方法,打開文件時(shí)同樣要設(shè)置newline=''。dialect和fmtparams作用與reader函數(shù)類似。示例如下:
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'])
- 其他函數(shù):csv.register_dialect(name, [dialect, **fmtparams])用于注冊自定義 CSV 變種;csv.unregister_dialect(name)刪除已注冊變種;csv.get_dialect(name)獲取指定變種;csv.list_dialects()返回所有已注冊變種名稱;csv.field_size_limit([new_limit])獲取或設(shè)置解析器允許的最大字段大小。
(二)模塊類
- csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', \*args, \**kwds):創(chuàng)建的對(duì)象類似常規(guī)reader,但將每行數(shù)據(jù)映射為字典,鍵由fieldnames指定。若fieldnames未提供,則文件第一行數(shù)據(jù)用作字段名并從結(jié)果中去除;若提供了,則第一行數(shù)據(jù)包含在結(jié)果中。多余字段數(shù)據(jù)會(huì)存儲(chǔ)在以restkey為鍵的列表中(默認(rèn)為None),缺失字段用restval填充(默認(rèn)為None)。例如:
import csv
with open('names.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['first_name'], row['last_name'])
csv.Dialect:是一個(gè)容器類,通過其屬性定義 CSV 文件的格式處理方式,如雙引號(hào)、空白符、分隔符等的處理規(guī)則。不同的Dialect子類對(duì)應(yīng)不同的 CSV 文件格式變種,例如csv.excel定義了 Excel 生成的 CSV 文件的常規(guī)屬性,csv.excel_tab對(duì)應(yīng) Excel 生成的制表符分隔的 CSV 文件,csv.unix_dialect適用于 UNIX 系統(tǒng)生成的 CSV 文件(以'\n'為換行符,所有字段用引號(hào)包圍) 。csv.Sniffer:用于推斷 CSV 文件的格式。sniff(sample, delimiters=None)方法分析給定樣本數(shù)據(jù),返回包含格式參數(shù)的Dialect子類;has_header(sample)方法判斷樣本數(shù)據(jù)首行是否為列標(biāo)題,但這是一個(gè)粗略的啟發(fā)式方法,可能出現(xiàn)誤判。使用示例:
with open('example.csv', newline='') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
# 處理CSV文件內(nèi)容
(三)模塊常量
csv模塊定義了多個(gè)常量,用于控制writer和reader對(duì)象的引號(hào)處理行為。如csv.QUOTE_ALL指示writer給所有字段加引號(hào);csv.QUOTE_MINIMAL僅為包含特殊字符的字段加引號(hào);csv.QUOTE_NONNUMERIC為非數(shù)字字段加引號(hào),并讓reader將未加引號(hào)的字段轉(zhuǎn)換為float類型;csv.QUOTE_NONE不使用引號(hào)引出字段,輸出數(shù)據(jù)中定界符前需加轉(zhuǎn)義符;csv.QUOTE_NOTNULL為不為None的字段加引號(hào);csv.QUOTE_STRINGS總是為字符串字段加引號(hào) 。需要注意的是,在 Python 3.12 中,QUOTE_NOTNULL和QUOTE_STRINGS對(duì)reader對(duì)象的行為存在 bug,該問題在 Python 3.13 中得到修復(fù)。
(四)模塊異常
csv.Error異常由csv模塊中發(fā)生錯(cuò)誤的函數(shù)拋出,在編寫代碼處理 CSV 文件時(shí),可通過捕獲該異常來處理可能出現(xiàn)的錯(cuò)誤,如文件格式錯(cuò)誤、字段解析錯(cuò)誤等。例如:
import csv, sys
filename ='some.csv'
with open(filename, newline='') as f:
reader = csv.reader(f)
try:
for row in reader:
print(row)
except csv.Error as e:
sys.exit(f'file {filename}, line {reader.line_num}: {e}')
三、變種與格式參數(shù)
不同的 CSV 文件可能在分隔符、引號(hào)處理、行終止符等格式上存在差異,csv模塊通過Dialect類的子類和格式參數(shù)來應(yīng)對(duì)這些差異。Dialect類支持以下屬性:
| 屬性名 | 描述 | 默認(rèn)值 |
|---|---|---|
delimiter | 字段分隔符,單字符 | ',' |
doublequote | 控制字段中引號(hào)字符的引出方式,True表示雙寫引號(hào)字符,False表示在引號(hào)字符前加轉(zhuǎn)義符 | True |
escapechar | 用于轉(zhuǎn)義定界符(quoting為QUOTE_NONE時(shí))或引號(hào)字符(doublequote為False時(shí))的單字符 | None(禁用轉(zhuǎn)義) |
lineterminator | writer產(chǎn)生的行的結(jié)尾字符 | '\r\n' |
quotechar | 用于包住含有特殊字符字段的單字符 | '"' |
quoting | 控制writer生成引號(hào)和reader識(shí)別引號(hào)的時(shí)機(jī),可設(shè)為QUOTE_*常量 | QUOTE_MINIMAL |
skipinitialspace | 是否忽略緊跟在分隔符后的空格 | False |
strict | 輸入錯(cuò)誤的 CSV 時(shí)是否拋出Error異常 | False |
在創(chuàng)建reader或writer對(duì)象時(shí),可以指定dialect參數(shù)(字符串或Dialect子類實(shí)例),也可以單獨(dú)指定格式參數(shù)來覆蓋dialect中的默認(rèn)設(shè)置。
四、Reader 對(duì)象與 Writer 對(duì)象
(一)Reader 對(duì)象
Reader對(duì)象(包括DictReader實(shí)例和reader()函數(shù)返回的對(duì)象)用于讀取 CSV 數(shù)據(jù)。它具有以下方法和屬性:
- 方法:
__next__()方法返回可迭代對(duì)象的下一行數(shù)據(jù),根據(jù)當(dāng)前Dialect解析,可通過next(reader)調(diào)用。 - 屬性:
dialect屬性為只讀,用于獲取當(dāng)前解析使用的變種描述;line_num屬性記錄源迭代器已讀取的行數(shù),與返回的記錄數(shù)可能不同,因?yàn)橛涗浛赡芸缭蕉嘈小?code>DictReader對(duì)象還有fieldnames屬性,用于獲取字段名稱,若創(chuàng)建對(duì)象時(shí)未傳入,則在首次訪問或讀取第一條記錄時(shí)初始化。
(二)Writer 對(duì)象
Writer對(duì)象(包括DictWriter實(shí)例和writer()函數(shù)返回的對(duì)象)負(fù)責(zé)將數(shù)據(jù)寫入 CSV 文件。其方法和屬性如下:
- 方法:
writerow(row)方法將row寫入文件對(duì)象,按當(dāng)前Dialect格式化,返回底層文件對(duì)象write方法的返回值;writerows(rows)方法將rows中的所有元素寫入文件對(duì)象。DictWriter對(duì)象的writeheader()方法用于寫入一行字段名稱(構(gòu)造函數(shù)中指定),返回csvwriter.writerow()方法的返回值。 - 屬性:
dialect屬性為只讀,供writer使用,用于獲取當(dāng)前寫入使用的變種描述。
五、實(shí)際應(yīng)用示例
(一)基本讀寫操作
- 讀取 CSV 文件:使用
csv.reader讀取文件,逐行打印數(shù)據(jù)。
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
- 寫入 CSV 文件:利用
csv.writer將數(shù)據(jù)寫入文件。
import csv
with open('some.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows([['data1', 'data2'], ['data3', 'data4']])
(二)處理特殊格式文件
處理非標(biāo)準(zhǔn) CSV 格式文件時(shí),需根據(jù)文件格式特點(diǎn)設(shè)置相應(yīng)的參數(shù)。例如,處理以冒號(hào)為分隔符且不使用引號(hào)的文件:
import csv
with open('passwd', newline='') as f:
reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
for row in reader:
print(row)
(三)注冊自定義變種
若項(xiàng)目中頻繁使用特定格式的 CSV 文件,可注冊自定義變種。例如:
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
reader = csv.reader(f, 'unixpwd')
(四)處理字符串?dāng)?shù)據(jù)
雖然csv模塊不直接支持解析字符串,但可以通過將字符串包裝成可迭代對(duì)象來處理。例如:
import csv
for row in csv.reader(['one,two,three']):
print(row)
總結(jié)
Python 的csv模塊為 CSV 文件處理提供了全面且靈活的工具。通過掌握csv模塊的函數(shù)、類、常量以及變種與格式參數(shù)的設(shè)置,開發(fā)者能夠高效地讀取、寫入和處理各種格式的 CSV 文件。在實(shí)際應(yīng)用中,要根據(jù) CSV 文件的具體格式特點(diǎn)選擇合適的方法和參數(shù),同時(shí)注意處理可能出現(xiàn)的錯(cuò)誤情況,確保數(shù)據(jù)處理的準(zhǔn)確性和穩(wěn)定性。
以上就是Python中CSV文件處理全攻略的詳細(xì)內(nèi)容,更多關(guān)于Python CSV文件處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
對(duì)Python subprocess.Popen子進(jìn)程管道阻塞詳解
今天小編就為大家分享一篇對(duì)Python subprocess.Popen子進(jìn)程管道阻塞詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Python3中在Anaconda環(huán)境下安裝basemap包
今天小編就為大家分享一篇關(guān)于Python3中在Anaconda環(huán)境下安裝basemap包的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
Python自動(dòng)化實(shí)現(xiàn)將PowerPoint演示文稿轉(zhuǎn)換為HTML
在日常工作中,PowerPoint演示文稿(PPT)是信息傳達(dá)和內(nèi)容展示的重要載體,本文將深入探討如何利用Python,將PowerPoint演示文稿高效、準(zhǔn)確地轉(zhuǎn)換為HTML格式,有需要的可以了解下2025-10-10
Python執(zhí)行PostgreSQL數(shù)據(jù)庫的SQL腳本詳解
Psycopg2是一個(gè)用于Python編程語言的第三方庫,用于訪問PostgreSQL數(shù)據(jù)庫系統(tǒng),可以輕松地在Python程序中進(jìn)行數(shù)據(jù)庫操作,下面小編就來和大家詳細(xì)介紹一下它吧2025-05-05
python中以函數(shù)作為參數(shù)(回調(diào)函數(shù))的實(shí)現(xiàn)方法
這篇文章主要介紹了python中以函數(shù)作為參數(shù)(回調(diào)函數(shù))的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Python程序員面試題 你必須提前準(zhǔn)備!(答案及解析)
這篇文章主要為大家解析了你必須提前準(zhǔn)備的Python程序員面試題答案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

