Python中CSV文件處理全攻略
一、CSV 格式簡介
CSV 格式是一種以純文本形式存儲表格數(shù)據(jù)的文件格式,用特定分隔符(通常是逗號)隔開不同字段。例如,一條包含姓名、年齡和城市的記錄,在 CSV 文件中可能表示為"Alice,25,New York"。雖然 CSV 格式被廣泛應(yīng)用,但由于缺乏統(tǒng)一標準,不同應(yīng)用程序生成的 CSV 文件在格式細節(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 變種,默認為'excel'
,也可通過list_dialects()
函數(shù)獲取已注冊變種名稱或自定義Dialect
子類實例來設(shè)置。fmtparams
用于覆蓋當前變種的單個格式參數(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為鍵的列表中(默認為None),缺失字段用restval填充(默認為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ù)首行是否為列標題,但這是一個粗略的啟發(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 中得到修復。
(四)模塊異常
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
類支持以下屬性:
屬性名 | 描述 | 默認值 |
---|---|---|
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 識別引號的時機,可設(shè)為QUOTE_* 常量 | QUOTE_MINIMAL |
skipinitialspace | 是否忽略緊跟在分隔符后的空格 | False |
strict | 輸入錯誤的 CSV 時是否拋出Error 異常 | False |
在創(chuàng)建reader
或writer
對象時,可以指定dialect
參數(shù)(字符串或Dialect
子類實例),也可以單獨指定格式參數(shù)來覆蓋dialect
中的默認設(shè)置。
四、Reader 對象與 Writer 對象
(一)Reader 對象
Reader
對象(包括DictReader
實例和reader()
函數(shù)返回的對象)用于讀取 CSV 數(shù)據(jù)。它具有以下方法和屬性:
- 方法:
__next__()
方法返回可迭代對象的下一行數(shù)據(jù),根據(jù)當前Dialect
解析,可通過next(reader)
調(diào)用。 - 屬性:
dialect
屬性為只讀,用于獲取當前解析使用的變種描述;line_num
屬性記錄源迭代器已讀取的行數(shù),與返回的記錄數(shù)可能不同,因為記錄可能跨越多行。DictReader
對象還有fieldnames
屬性,用于獲取字段名稱,若創(chuàng)建對象時未傳入,則在首次訪問或讀取第一條記錄時初始化。
(二)Writer 對象
Writer
對象(包括DictWriter
實例和writer()
函數(shù)返回的對象)負責將數(shù)據(jù)寫入 CSV 文件。其方法和屬性如下:
- 方法:
writerow(row)
方法將row
寫入文件對象,按當前Dialect
格式化,返回底層文件對象write
方法的返回值;writerows(rows)
方法將rows
中的所有元素寫入文件對象。DictWriter
對象的writeheader()
方法用于寫入一行字段名稱(構(gòu)造函數(shù)中指定),返回csvwriter.writerow()
方法的返回值。 - 屬性:
dialect
屬性為只讀,供writer
使用,用于獲取當前寫入使用的變種描述。
五、實際應(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']])
(二)處理特殊格式文件
處理非標準 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')
(四)處理字符串數(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ù)處理的準確性和穩(wěn)定性。
以上就是Python中CSV文件處理全攻略的詳細內(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-05python enumerate內(nèi)置函數(shù)用法總結(jié)
這篇文章主要介紹了python enumerate內(nèi)置函數(shù)用法總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01pytorch中的優(yōu)化器optimizer.param_groups用法
這篇文章主要介紹了pytorch中的優(yōu)化器optimizer.param_groups用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05