簡(jiǎn)介
csv文件具有格式簡(jiǎn)單掰吕,快速存取果覆,兼容性好等特點(diǎn),工程殖熟、金融局待、商業(yè)等很多數(shù)據(jù)文件都是采用csv文件保存和處理。工作中數(shù)據(jù)處理也用到了csv,簡(jiǎn)要總結(jié)下使用經(jīng)驗(yàn)钳榨,特別是那些由于本地兼容性導(dǎo)致的與官方文檔的差異使用舰罚。
csv(comma Seperated Values)文件的格式非常簡(jiǎn)單,類似一個(gè)文本文檔重绷,每一行保存一條數(shù)據(jù)沸停,同一行中的各個(gè)數(shù)據(jù)通常采用逗號(hào)(或tab)分隔悔叽。
與Python相關(guān)
python自帶了csv模塊浸颓,專門用于處理csv文件的讀取和存檔。
csv模塊中坎藐,主要由兩種方式存取csv文件:函數(shù)方法候醒;類方法能颁。
常用函數(shù)
讀操作
csv.reader(csvfile,dialect ='excel'倒淫,** fmtparams)
返回一個(gè)reader對(duì)象伙菊,它將迭代給定csvfile中的行。
csvfile可以是任何支持迭代器協(xié)議的對(duì)象敌土,并在每次next()調(diào)用其方法時(shí)返回一個(gè)字符串- 文件對(duì)象和列表對(duì)象都是合適的镜硕。如果csvfile是一個(gè)文件對(duì)象,那么它必須在平臺(tái)上以“b”標(biāo)志打開返干,這會(huì)產(chǎn)生影響兴枯。可以給出可選的 dialect 參數(shù)矩欠,該參數(shù)用于定義特定于CSV方言的一組參數(shù)财剖。它可以是類的子類的實(shí)例,也可以是函數(shù)Dialect返回的字符串之一 list_dialects()癌淮。其他可選的fmtparams可以給出關(guān)鍵字參數(shù)來覆蓋當(dāng)前方言中的各個(gè)格式參數(shù)躺坟。
import csv
with open('erroe.csv','rb') as csvred:
spam = csv.reader(csvred,delimiter=' ', quotechar='|')
for rem in spam:
print ','.join(rem)
寫操作
csv.writer(csvfile,dialect ='excel'乳蓄,** fmtparams)
返回一個(gè)編寫器對(duì)象咪橙,負(fù)責(zé)將用戶的數(shù)據(jù)轉(zhuǎn)換為給定的類文件對(duì)象上的分隔字符串。
csvfile可以是帶有write()方法的任何對(duì)象 虚倒。如果csvfile是一個(gè)文件對(duì)象匣摘,那么它必須在平臺(tái)上以“b”標(biāo)志打開,這會(huì)產(chǎn)生影響裹刮。 可以給出可選的dialect參數(shù)音榜,該參數(shù)用于定義特定于CSV方言的一組參數(shù)。它可以是類的子類的實(shí)例捧弃,也可以是函數(shù)Dialect返回的字符串之一 list_dialects()赠叼〔聊遥可以給出其他可選的fmtparams關(guān)鍵字參數(shù)來覆蓋當(dāng)前dialect中的各個(gè)格式參數(shù)。
import csv
with open('error.csv', 'wb') 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'])
其他
- csv.register_dialect(name嘴办,[dialect,] ** fmtparams)
將dialect與name聯(lián)系起來瞬场。 name必須是字符串或Unicode對(duì)象。dialect可以通過傳遞子類Dialect涧郊,或通過fmtparams關(guān)鍵字參數(shù)或兩者來指定贯被,并使用關(guān)鍵字參數(shù)覆蓋dialect的參數(shù) - csv.unregister_dialect(name)
從dialect注冊(cè)表中刪除與名稱關(guān)聯(lián)的dialect。如果name不是已注冊(cè)的dialect名稱妆艘,則引發(fā)An 錯(cuò)誤 - csv.get_dialect(name)
返回與name相關(guān)的dialect彤灶。如果name 不是已注冊(cè)的dialect名稱,則引發(fā)An 錯(cuò)誤 - csv.list_dialects()
返回所有已注冊(cè)dialect的名稱 - csv.field_size_limit([new_limit])
返回解析器允許的當(dāng)前最大字段大小批旺。如果給出new_limit幌陕,則這將成為新限制
常用類
讀操作
class csv.DictReader(f,fieldnames = None汽煮,restkey = None搏熄,restval = None,dialect ='excel'暇赤,* args心例,** kwds)
創(chuàng)建一個(gè)像常規(guī)閱讀器一樣操作的對(duì)象,但將讀取的信息映射到一個(gè)dict鞋囊,其鍵由可選的 fieldnames參數(shù)給出止后。字段名的參數(shù)是一個(gè)序列,其元素與輸入數(shù)據(jù)的順序中的字段相關(guān)聯(lián)失暴。這些元素成為結(jié)果字典的關(guān)鍵坯门。如果省略fieldnames參數(shù)微饥,則文件f的第一行中的值將用作字段名逗扒。如果讀取的行包含的字段多于字段名序列,則將剩余數(shù)據(jù)添加為由restkey值鍵入的序列欠橘。如果讀取的行的字段數(shù)少于字段名序列矩肩,則其余的鍵將采用可選的restval參數(shù)的值。任何其他可選或關(guān)鍵字參數(shù)都將傳遞給基礎(chǔ)reader
實(shí)例肃续。
import csv
with open('/Users/mioji/Desktop/api_error/error.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['apan'], row['spam'])
寫操作
class csv.DictWriter(f黍檩,fieldnames,restval =''始锚,extrasaction ='raise'刽酱,dialect ='excel',* args瞧捌,** kwds)
創(chuàng)建一個(gè)像常規(guī)編寫器一樣操作的對(duì)象棵里,但將字典映射到輸出行润文。的字段名的參數(shù)是一個(gè)序列識(shí)別在哪些值在傳遞給字典中的順序按鍵的writerow()方法被寫入到文件?F。如果字典缺少字段名中的鍵殿怜,則可選的restval參數(shù)指定要寫入的值典蝌。如果傳遞給方法的字典包含在字段名中找不到的鍵,則可選的extrasaction參數(shù)指示要采取的操作头谜。如果設(shè)置為a 則被提升骏掀。如果設(shè)置為writerow()'raise'ValueError'ignore',字典中的額外值將被忽略柱告。任何其他可選或關(guān)鍵字參數(shù)都將傳遞給基礎(chǔ) writer實(shí)例截驮。
請(qǐng)注意,與DictReader類不同末荐,它的fieldnames參數(shù)DictWriter不是可選的侧纯。由于Python的dict 對(duì)象沒有排序,因此沒有足夠的信息來推斷應(yīng)該將行寫入文件f的順序甲脏。
import csv
with open('names.csv', 'w') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, 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'})
其他
- class csv.Dialect
Dialect類是依賴于主要用于它的屬性眶熬,這是用來定義一個(gè)特定的參數(shù)的容器類 reader或writer實(shí)例 - class csv.excel
在excel類定義的Excel生成CSV文件的通常的性質(zhì)。它以方言名稱注冊(cè)'excel'块请。 - class csv.excel_tab
excel_tab類定義Excel生成的制表符分隔的文件的通常的性質(zhì)娜氏。它以方言名稱注冊(cè)'excel-tab'。 - class csv.Sniffer
Sniffer類用來推斷一個(gè)CSV文件的格式墩新。
Sniffer類提供了兩個(gè)方法:
sniff(樣本贸弥,分隔符=無):分析給定的樣本并返回Dialect反映找到的參數(shù)的子類。如果給出了可選的delimiters參數(shù)海渊,則將其解釋為包含可能的有效分隔符的字符串绵疲。
has_header(樣本):分析示例文本(假定為CSV格式), True如果第一行看起來是一系列列標(biāo)題臣疑,則返回盔憨。
常量
- csv.QUOTE_ALL
指示writer對(duì)象引用所有字段。 - csv.QUOTE_MINIMAL
指示writer對(duì)象只引用那些包含特殊字符讯沈,如字段分隔符郁岩,quotechar或任何字符 lineterminator。 - csv.QUOTE_NONNUMERIC
指示writer對(duì)象引用所有非數(shù)字字段缺狠。
指示讀者將所有非引用字段轉(zhuǎn)換為float類型问慎。 - csv.QUOTE_NONE
指示writer對(duì)象永遠(yuǎn)不引用字段。當(dāng)輸出數(shù)據(jù)中出現(xiàn)當(dāng)前 分隔符時(shí)挤茄,它前面是當(dāng)前的escapechar 字符如叼。如果未設(shè)置escapechar,則Error在遇到需要轉(zhuǎn)義的任何字符時(shí)穷劈,編寫器將引發(fā)笼恰。
指示reader不對(duì)引號(hào)字符執(zhí)行特殊處理片酝。