python中內置庫csv的使用及說明
所謂的CSV(逗號分隔值)格式是電子表格和數據庫最常用的導入和導出格式。
嘗試使用CSV格式進行標準化描述之前已經使用瞭很多年。
該csv模塊reader和writer對象讀取和寫入序列。
程序員還可以使用DictReader和DictWriter類以字典形式讀取和寫入數據。
讀取
reader(iterable, dialect=‘excel', *args, **kwargs)
該方法返回一個reader對象,該對象將遍歷給定的iterable中的行。默認情況下,從csv文件中讀取的每一行都作為字符串列表返回,除非指定瞭quoting參數值為QUOTE_NONNUMERIC。如下:
假設有這麼一個文件a.csv,內容如下:
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) ############# 打印結果如下 ############# <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']
當我們設置quoting參數值為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) ############# 打印結果如下 ############# <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]
更多參數解釋請看下面kwargs參數
DictReader(f, fieldnames=None, restkey=None, restval=None, dialect=“excel”, *args, **kwds)
創建一個DictReader對象,其功能類似於常規讀取器,但是將每行的信息映射到OrderDict當中。
OrderDict的鍵名可由filednames參數指定,如果未指定,那麼將由第一行數據作為鍵名;如果數據中的字段多於字段名列表,則剩餘的數據以列表存儲起來,其健名由restkey指定(默認為None);如果數據中的值少於字段名列表,則缺少的值將默認填充為restval設定的值(默認為None)。
with open('a.csv') as f: reader = csv.DictReader(f) print(type(reader), reader) for item in reader: print(type(item), item) ############# 打印結果如下 ############# <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')])
設置瞭fieldnames情況下:
... reader = csv.DictReader(f, fieldnames=['a', 'b', 'c', 'd']) ... ############# 打印結果如下 ############# <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
: 獲取閱讀器讀取的行數fieldnames
: 獲取鍵名(DictReader對象獨有)
更多參數解釋請看下面kwargs參數
寫入
writer(fileobj, dialect=‘excel', *args, **kwargs)
將用戶數據寫入到指定的文件對象上,返回一個writer對象
import csv # 一定要指定newline='', 否則將會每行數據之間將會有空行 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])
更多參數解釋請看下面kwargs參數
DictWriter(f, fieldnames, restval="", extrasaction=“raise”, dialect=“excel”, *args, **kwds)
將用戶數據寫入到指定文件對象上,但需指定fieldnames(鍵名),返回一個DictWriter對象。
如果數據中的值少於字段名列表,則缺少的值將默認填充為restval設定的值(默認為None)。
import csv # 一定要指定newline='', 否則將會每行數據之間將會有空行 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})
值得註意的是,默認情況下fieldnames數據並不會寫入到文件當中!
無論是reader對象還是DictReader對象,都具有如下操作:
writerow(rowdict): 將行數據寫入到文件對象 writerows(rowdicts): 所有行數據寫入到文件對象當中 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數據寫入一行(DictWriter對象獨有)
更多參數解釋請看下面kwargs參數
kwargs參數
delimiter
一個用於分割字段的分隔符,默認為,
lineterminator
行終止符,默認為\r\n
quoting
控制何時引用應該由作者產生並被讀者識別
skipinitialspace
如果設置為True,分割符後面的空白將被忽略。默認為False
""" 假設a.csv的內容如下 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) ############ 默認情況,打印如下 ############ <class 'list'> ['1', ' 2', '3', '4'] ############ skipinitialspace=True,打印如下 ############ <class 'list'> ['1', '2', '3', '4']
strict
如果設置為True,則將csv輸入錯誤時將引發異常。默認為False
更多參數解釋以及csv模塊的使用,請看:https://docs.python.org/3.7/library/csv.html
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 零基礎也能看懂的python內置csv模塊教程
- python csv實時一條一條插入且表頭不重復問題
- Python中CSV文件(逗號分割)實戰操作指南
- Python數據讀寫之Python讀寫CSV文件
- python操作csv格式文件之csv.DictReader()方法