python中內(nèi)置庫csv的使用及說明
所謂的CSV(逗號分隔值)格式是電子表格和數(shù)據(jù)庫最常用的導(dǎo)入和導(dǎo)出格式。
嘗試使用CSV格式進行標(biāo)準(zhǔn)化描述之前已經(jīng)使用了很多年。
該csv模塊reader和writer對象讀取和寫入序列。
程序員還可以使用DictReader和DictWriter類以字典形式讀取和寫入數(shù)據(jù)。
讀取
reader(iterable, dialect=‘excel', *args, **kwargs)
該方法返回一個reader對象,該對象將遍歷給定的iterable中的行。默認(rèn)情況下,從csv文件中讀取的每一行都作為字符串列表返回,除非指定了quoting參數(shù)值為QUOTE_NONNUMERIC。如下:
假設(shè)有這么一個文件a.csv,內(nèi)容如下:
1,2,3,4
5,6,7,8
9,10,11,12
我們讀取一下這個csv
import csv
with open('a.csv') as f:
? ? reader = csv.reader(f)
? ? print(type(reader), reader)
? ? for item in reader:
? ? ? ? print(type(item), item)
? ? ? ??
############# 打印結(jié)果如下 #############
<class '_csv.reader'> <_csv.reader object at 0x000002194D601F50>
<class 'list'> ['1', '2', '3', '4']
<class 'list'> ['5', '6', '7', '8']
<class 'list'> ['9', '10', '11', '12']當(dāng)我們設(shè)置quoting參數(shù)值為QUOTE_NONNUMERIC時:
with open('a.csv') as f:
? ? reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
? ? print(type(reader), reader)
? ? for item in reader:
? ? ? ? print(type(item), item)
? ? ? ??
############# 打印結(jié)果如下 #############
<class '_csv.reader'> <_csv.reader object at 0x000002BFC3291F50>
<class 'list'> [1.0, 2.0, 3.0, 4.0]
<class 'list'> [5.0, 6.0, 7.0, 8.0]
<class 'list'> [9.0, 10.0, 11.0, 12.0]更多參數(shù)解釋請看下面kwargs參數(shù)
DictReader(f, fieldnames=None, restkey=None, restval=None, dialect=“excel”, *args, **kwds)
創(chuàng)建一個DictReader對象,其功能類似于常規(guī)讀取器,但是將每行的信息映射到OrderDict當(dāng)中。
OrderDict的鍵名可由filednames參數(shù)指定,如果未指定,那么將由第一行數(shù)據(jù)作為鍵名;如果數(shù)據(jù)中的字段多于字段名列表,則剩余的數(shù)據(jù)以列表存儲起來,其健名由restkey指定(默認(rèn)為None);如果數(shù)據(jù)中的值少于字段名列表,則缺少的值將默認(rèn)填充為restval設(shè)定的值(默認(rèn)為None)。
with open('a.csv') as f:
? ? reader = csv.DictReader(f)
? ? print(type(reader), reader)
? ? for item in reader:
? ? ? ? print(type(item), item)
############# 打印結(jié)果如下 #############
<class 'csv.DictReader'> <csv.DictReader object at 0x000001F3EE9A8898>
<class 'collections.OrderedDict'> OrderedDict([('1', '5'), ('2', '6'), ('3', '7'), ('4', '8')])
<class 'collections.OrderedDict'> OrderedDict([('1', '9'), ('2', '10'), ('3', '11'), ('4', '12')])設(shè)置了fieldnames情況下:
...
reader = csv.DictReader(f, fieldnames=['a', 'b', 'c', 'd'])
...
############# 打印結(jié)果如下 #############
<class 'csv.DictReader'> <csv.DictReader object at 0x00000249BED38898>
<class 'collections.OrderedDict'> OrderedDict([('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')])
<class 'collections.OrderedDict'> OrderedDict([('a', '5'), ('b', '6'), ('c', '7'), ('d', '8')])
<class 'collections.OrderedDict'> OrderedDict([('a', '9'), ('b', '10'), ('c', '11'), ('d', '12')])無論是reader對象還是DictReader對象,都具有如下操作:
__next__(): 將閱讀器可迭代對象的下一行作為列表或字典返回dialect: 獲取閱讀器的dialect描述line_num: 獲取閱讀器讀取的行數(shù)fieldnames: 獲取鍵名(DictReader對象獨有)
更多參數(shù)解釋請看下面kwargs參數(shù)
寫入
writer(fileobj, dialect=‘excel', *args, **kwargs)
將用戶數(shù)據(jù)寫入到指定的文件對象上,返回一個writer對象
import csv
# 一定要指定newline='', 否則將會每行數(shù)據(jù)之間將會有空行
with open('b.csv', mode='w', newline='') as f:
? ? writer = csv.writer(f)
? ? writer.writerow([1, 2, 3, 4])
? ? writer.writerow([5, 6, 7, 8])更多參數(shù)解釋請看下面kwargs參數(shù)
DictWriter(f, fieldnames, restval="", extrasaction=“raise”, dialect=“excel”, *args, **kwds)
將用戶數(shù)據(jù)寫入到指定文件對象上,但需指定fieldnames(鍵名),返回一個DictWriter對象。
如果數(shù)據(jù)中的值少于字段名列表,則缺少的值將默認(rèn)填充為restval設(shè)定的值(默認(rèn)為None)。
import csv
# 一定要指定newline='', 否則將會每行數(shù)據(jù)之間將會有空行
with open('b.csv', mode='w', newline='') as f:
? ? writer = csv.DictWriter(f, fieldnames=['a', 'b', 'c', 'd'])
? ? writer.writerow({'a': 1, 'b': 2, 'c': 3, 'd': 4})
? ? writer.writerow({'a': 5, 'b': 6, 'c': 7, 'd': 8})值得注意的是,默認(rèn)情況下fieldnames數(shù)據(jù)并不會寫入到文件當(dāng)中!
無論是reader對象還是DictReader對象,都具有如下操作:
writerow(rowdict): 將行數(shù)據(jù)寫入到文件對象
writerows(rowdicts): 所有行數(shù)據(jù)寫入到文件對象當(dāng)中
import csv
with open('b.csv', mode='w', newline='') as f:
? ? writer = csv.writer(f)
? ? writer.writerows([[1, 2, 3, 4], [5, 6, 7, 8]])dialect: 獲取寫入器的dialect描述writeheader(): 用fieldnames數(shù)據(jù)寫入一行(DictWriter對象獨有)
更多參數(shù)解釋請看下面kwargs參數(shù)
kwargs參數(shù)
delimiter
一個用于分割字段的分隔符,默認(rèn)為,
lineterminator
行終止符,默認(rèn)為\r\n
quoting
控制何時引用應(yīng)該由作者產(chǎn)生并被讀者識別
skipinitialspace
如果設(shè)置為True,分割符后面的空白將被忽略。默認(rèn)為False
"""
假設(shè)a.csv的內(nèi)容如下
1, 2,3,4
"""
import csv
with open('a.csv') as f:
? ? reader = csv.reader(f)
? ? # reader = csv.reader(f, skipinitialspace=True)
? ? for item in reader:
? ? ? ? print(type(item), item)
############ 默認(rèn)情況,打印如下 ############
<class 'list'> ['1', ' 2', '3', '4']
############ skipinitialspace=True,打印如下 ############
<class 'list'> ['1', '2', '3', '4']strict
如果設(shè)置為True,則將csv輸入錯誤時將引發(fā)異常。默認(rèn)為False
更多參數(shù)解釋以及csv模塊的使用,請看:https://docs.python.org/3.7/library/csv.html
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決pyinstaller打包發(fā)布后的exe文件打開控制臺閃退的問題
今天小編就為大家分享一篇解決pyinstaller打包發(fā)布后的exe文件打開控制臺閃退的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
python爬蟲MeterSphere平臺執(zhí)行報告使用實戰(zhàn)
這篇文章主要為大家介紹了python爬蟲MeterSphere平臺執(zhí)行報告使用實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
django rest framework 實現(xiàn)用戶登錄認(rèn)證詳解
這篇文章主要介紹了django rest framework 實現(xiàn)用戶登錄認(rèn)證詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07

