Python中CSV文件處理全攻略
一、CSV 格式簡介
CSV 格式是一種以純文本形式存儲表格數(shù)據(jù)的文件格式,用特定分隔符(通常是逗號)隔開不同字段。例如,一條包含姓名、年齡和城市的記錄,在 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)建一個reader對象,從給定的csvfile中讀取數(shù)據(jù)。csvfile可以是文件對象或包含字符串的可迭代對象,打開文件時需設(shè)置newline=''。dialect參數(shù)指定 CSV 變種,默認(rèn)為'excel',也可通過list_dialects()函數(shù)獲取已注冊變種名稱或自定義Dialect子類實例來設(shè)置。fmtparams用于覆蓋當(dāng)前變種的單個格式參數(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):返回一個writer對象,將數(shù)據(jù)轉(zhuǎn)換為帶分隔符的字符串寫入csvfile。csvfile需具有write()方法,打開文件時同樣要設(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)建的對象類似常規(guī)reader,但將每行數(shù)據(jù)映射為字典,鍵由fieldnames指定。若fieldnames未提供,則文件第一行數(shù)據(jù)用作字段名并從結(jié)果中去除;若提供了,則第一行數(shù)據(jù)包含在結(jié)果中。多余字段數(shù)據(jù)會存儲在以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:是一個容器類,通過其屬性定義 CSV 文件的格式處理方式,如雙引號、空白符、分隔符等的處理規(guī)則。不同的Dialect子類對應(yīng)不同的 CSV 文件格式變種,例如csv.excel定義了 Excel 生成的 CSV 文件的常規(guī)屬性,csv.excel_tab對應(yīng) Excel 生成的制表符分隔的 CSV 文件,csv.unix_dialect適用于 UNIX 系統(tǒng)生成的 CSV 文件(以'\n'為換行符,所有字段用引號包圍) 。csv.Sniffer:用于推斷 CSV 文件的格式。sniff(sample, delimiters=None)方法分析給定樣本數(shù)據(jù),返回包含格式參數(shù)的Dialect子類;has_header(sample)方法判斷樣本數(shù)據(jù)首行是否為列標(biāo)題,但這是一個粗略的啟發(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模塊定義了多個常量,用于控制writer和reader對象的引號處理行為。如csv.QUOTE_ALL指示writer給所有字段加引號;csv.QUOTE_MINIMAL僅為包含特殊字符的字段加引號;csv.QUOTE_NONNUMERIC為非數(shù)字字段加引號,并讓reader將未加引號的字段轉(zhuǎn)換為float類型;csv.QUOTE_NONE不使用引號引出字段,輸出數(shù)據(jù)中定界符前需加轉(zhuǎn)義符;csv.QUOTE_NOTNULL為不為None的字段加引號;csv.QUOTE_STRINGS總是為字符串字段加引號 。需要注意的是,在 Python 3.12 中,QUOTE_NOTNULL和QUOTE_STRINGS對reader對象的行為存在 bug,該問題在 Python 3.13 中得到修復(fù)。
(四)模塊異常
csv.Error異常由csv模塊中發(fā)生錯誤的函數(shù)拋出,在編寫代碼處理 CSV 文件時,可通過捕獲該異常來處理可能出現(xiàn)的錯誤,如文件格式錯誤、字段解析錯誤等。例如:
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 文件可能在分隔符、引號處理、行終止符等格式上存在差異,csv模塊通過Dialect類的子類和格式參數(shù)來應(yīng)對這些差異。Dialect類支持以下屬性:
| 屬性名 | 描述 | 默認(rèn)值 |
|---|---|---|
delimiter | 字段分隔符,單字符 | ',' |
doublequote | 控制字段中引號字符的引出方式,True表示雙寫引號字符,False表示在引號字符前加轉(zhuǎn)義符 | True |
escapechar | 用于轉(zhuǎn)義定界符(quoting為QUOTE_NONE時)或引號字符(doublequote為False時)的單字符 | None(禁用轉(zhuǎn)義) |
lineterminator | writer產(chǎn)生的行的結(jié)尾字符 | '\r\n' |
quotechar | 用于包住含有特殊字符字段的單字符 | '"' |
quoting | 控制writer生成引號和reader識別引號的時機(jī),可設(shè)為QUOTE_*常量 | QUOTE_MINIMAL |
skipinitialspace | 是否忽略緊跟在分隔符后的空格 | False |
strict | 輸入錯誤的 CSV 時是否拋出Error異常 | False |
在創(chuàng)建reader或writer對象時,可以指定dialect參數(shù)(字符串或Dialect子類實例),也可以單獨指定格式參數(shù)來覆蓋dialect中的默認(rèn)設(shè)置。
四、Reader 對象與 Writer 對象
(一)Reader 對象
Reader對象(包括DictReader實例和reader()函數(shù)返回的對象)用于讀取 CSV 數(shù)據(jù)。它具有以下方法和屬性:
- 方法:
__next__()方法返回可迭代對象的下一行數(shù)據(jù),根據(jù)當(dāng)前Dialect解析,可通過next(reader)調(diào)用。 - 屬性:
dialect屬性為只讀,用于獲取當(dāng)前解析使用的變種描述;line_num屬性記錄源迭代器已讀取的行數(shù),與返回的記錄數(shù)可能不同,因為記錄可能跨越多行。DictReader對象還有fieldnames屬性,用于獲取字段名稱,若創(chuàng)建對象時未傳入,則在首次訪問或讀取第一條記錄時初始化。
(二)Writer 對象
Writer對象(包括DictWriter實例和writer()函數(shù)返回的對象)負(fù)責(zé)將數(shù)據(jù)寫入 CSV 文件。其方法和屬性如下:
- 方法:
writerow(row)方法將row寫入文件對象,按當(dāng)前Dialect格式化,返回底層文件對象write方法的返回值;writerows(rows)方法將rows中的所有元素寫入文件對象。DictWriter對象的writeheader()方法用于寫入一行字段名稱(構(gòu)造函數(shù)中指定),返回csvwriter.writerow()方法的返回值。 - 屬性:
dialect屬性為只讀,供writer使用,用于獲取當(dāng)前寫入使用的變種描述。
五、實際應(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 格式文件時,需根據(jù)文件格式特點設(shè)置相應(yīng)的參數(shù)。例如,處理以冒號為分隔符且不使用引號的文件:
import csv
with open('passwd', newline='') as f:
reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
for row in reader:
print(row)
(三)注冊自定義變種
若項目中頻繁使用特定格式的 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模塊不直接支持解析字符串,但可以通過將字符串包裝成可迭代對象來處理。例如:
import csv
for row in csv.reader(['one,two,three']):
print(row)
總結(jié)
Python 的csv模塊為 CSV 文件處理提供了全面且靈活的工具。通過掌握csv模塊的函數(shù)、類、常量以及變種與格式參數(shù)的設(shè)置,開發(fā)者能夠高效地讀取、寫入和處理各種格式的 CSV 文件。在實際應(yīng)用中,要根據(jù) CSV 文件的具體格式特點選擇合適的方法和參數(shù),同時注意處理可能出現(xiàn)的錯誤情況,確保數(shù)據(jù)處理的準(zhǔn)確性和穩(wěn)定性。
以上就是Python中CSV文件處理全攻略的詳細(xì)內(nèi)容,更多關(guān)于Python CSV文件處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python數(shù)據(jù)分析之?Pandas?Dataframe修改和刪除及查詢操作
這篇文章主要介紹了Python數(shù)據(jù)分析之?Pandas?Dataframe修改和刪除及查詢操作的相關(guān)資料,具有一定的參考價值,需要的小伙伴可以參考一下2022-05-05
python enumerate內(nèi)置函數(shù)用法總結(jié)
這篇文章主要介紹了python enumerate內(nèi)置函數(shù)用法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01
詳解python中init方法和隨機(jī)數(shù)方法
這篇文章主要介紹了python中init方法和隨機(jī)數(shù)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
python使用fork實現(xiàn)守護(hù)進(jìn)程的方法
守護(hù)進(jìn)程(Daemon)也稱為精靈進(jìn)程是一種生存期較長的一種進(jìn)程。它們獨立于控制終端并且周期性的執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。他們常常在系統(tǒng)引導(dǎo)裝入時啟動,在系統(tǒng)關(guān)閉時終止。2017-11-11
pytorch中的優(yōu)化器optimizer.param_groups用法
這篇文章主要介紹了pytorch中的優(yōu)化器optimizer.param_groups用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05

