最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中CSV文件處理全攻略

 更新時(shí)間:2025年05月18日 14:46:21   作者:tekin  
在數(shù)據(jù)處理和存儲(chǔ)領(lǐng)域,CSV格式憑借其簡單高效的特性,成為了電子表格和數(shù)據(jù)庫中常用的文件格式,Python 的csv模塊為操作 CSV 文件提供了強(qiáng)大的支持,本文將深入剖析csv模塊,幫助讀者全面掌握 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'])
  1. 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)包圍) 。
  2. 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è)常量,用于控制writerreader對(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_NOTNULLQUOTE_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)義定界符(quotingQUOTE_NONE時(shí))或引號(hào)字符(doublequoteFalse時(shí))的單字符None(禁用轉(zhuǎn)義)
lineterminatorwriter產(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)建readerwriter對(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ù)。它具有以下方法和屬性:

  1. 方法__next__()方法返回可迭代對(duì)象的下一行數(shù)據(jù),根據(jù)當(dāng)前Dialect解析,可通過next(reader)調(diào)用。
  2. 屬性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 文件。其方法和屬性如下:

  1. 方法writerow(row)方法將row寫入文件對(duì)象,按當(dāng)前Dialect格式化,返回底層文件對(duì)象write方法的返回值;writerows(rows)方法將rows中的所有元素寫入文件對(duì)象。DictWriter對(duì)象的writeheader()方法用于寫入一行字段名稱(構(gòu)造函數(shù)中指定),返回csvwriter.writerow()方法的返回值。
  2. 屬性dialect屬性為只讀,供writer使用,用于獲取當(dāng)前寫入使用的變種描述。

五、實(shí)際應(yīng)用示例

(一)基本讀寫操作

  1. 讀取 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)文章

最新評(píng)論

奈曼旗| 长汀县| 甘德县| 磴口县| 上栗县| 上饶市| 鸡东县| 武威市| 酒泉市| 临海市| 桑日县| 桦川县| 安新县| 米易县| 岳普湖县| 南溪县| 繁峙县| 南充市| 正蓝旗| 高要市| 孝义市| 分宜县| 赫章县| 佛坪县| 称多县| 星座| 博客| 肥乡县| 奈曼旗| 二连浩特市| 石首市| 邵东县| 蓬莱市| 江西省| 资溪县| 塘沽区| 沾益县| 泗水县| 通辽市| 奇台县| 巨野县|