零基礎也能看懂的python內置csv模塊教程

csv(Comma-Separated Values)文件是什麼?

它是一種文件格式,一般也被叫做逗號分隔值文件,可以使用 Excel 軟件或者文本文檔打開 。
其中數據字段用半角逗號間隔(也可以使用其它字符),使用 Excel 打開時,逗號會被轉換為分隔符。
csv 文件是以純文本形式存儲瞭表格數據,並且在兼容各個操作系統。

例如下面的文本,在 excel 中就以表格的形式存在。

sid,name,age
10010,橡皮擦,18
10086,發量迷人的喬喻,19
10000,各位博主,20

沒基礎,也可一文看懂 python 中的 csv 模塊

下面就對 python 內置模塊 csv 的用法進行簡單的說明。

python 中的 csv 文件清晰解法

讀取文件

使用 csv.reader() 讀取 csv 文件內容。

import csv  # 模塊導入

with open('aa.csv', 'r', newline='', encoding='utf-8') as f:
	# <_csv.reader object at 0x00000000020918D0>
    reader = csv.reader(f)
    for r in reader:
        print(r)

其中 csv.reader() 方法的原型如下所示:

csv.reader(csvfile, dialect='excel', **fmtparams)

其中的參數 csvfile 可以是任何對象,但要求該對象是一個迭代器,所以文件對象和列表對象都可以傳入,如果是文件對象,還要求打開它時攜帶參數 newline='' 。後面的參數保持默認即可。

第二種方式是使用 DictReader 類,該類實現的效果與 reader() 方法一致,也是接收可迭代對象,返回生成器,差異是將返回的結果放到瞭一個字典的值內,字典的鍵就是單元格的標題。並且這樣輸出的函數是,不需要單獨處理 csv 的列頭行瞭。

import csv  # 模塊導入
with open('aa.csv', 'r', newline='', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for r in reader:
        print(r)

輸出內容:

OrderedDict([('sid', '10010'), ('name', '橡皮擦'), ('age', '18')])
OrderedDict([('sid', '10086'), ('name', '發量迷人的喬喻'), ('age', '19')])
OrderedDict([('sid', '10000'), ('name', '各位博主'), ('age', '20')])

寫入文件

csv 文件寫入用到的模塊方法是 csv.writer(),該方法的原型如下:

csv.writer(csvfile, dialect='excel', **fmtparams)

最基本的寫入:

import csv
with open('abc.csv', 'w', newline='') as csvfile:
    w = csv.writer(csvfile)
    # 寫入列頭
    w.writerow(["sid", "name", "age"])
    w.writerow(["10010", "橡皮擦", "18"])
    w.writerow(["10086", "發量迷人的喬喻", "18"])

這時如果你在打開文件時,缺少瞭 newline='',那寫入 csv 文件內容之後,會出現多餘的換行。
除此之外,我們寫入 csv 文件的時候,可以啟用 dialect(方言)參數。例如使用 | 作為列的分隔符。
此時的文件寫入代碼寫成下述內容:

class my_dialect(csv.Dialect):
    lineterminator = '\r\n'
    delimiter = ';'
    quotechar = '"'
    quoting = csv.QUOTE_MINIMAL
with open('abc.csv', 'w', newline='') as csvfile:
    w = csv.writer(csvfile, dialect=my_dialect)
    # 寫入列頭
    w.writerow(["sid", "name", "age"])
    w.writerow(["10010", "橡皮擦", "18"])
    w.writerow(["10086", "發量迷人的喬喻", "18"])

上述代碼定義瞭一個新的類 my_dialect,並使其繼承 csv.Dialect 類,重寫瞭其中的部分字段。

delimiter:分隔字符,默認為 ,lineterminatorwriter 方法寫入數據時,每行的結尾字符,默認為 \r\nquotechar:單字符,用於包裹具有特殊字符的字段,例如 定界符,引號字符,換行符,默認是 "quoting:控制 writer 何時生成引號,以及 reader 何時識別引號,默認是 QUOTE_MINIMAL,其餘幾個值分別是

QUOTE_ALL(全部加引號),

QUOTE_MINIMAL(特定情況加),

QUOTE_NONNUMERIC(所有非數字加),

QUOTE_NONE(都不加);

Writer 對象的方法說明:

csvwriter.writerow(row):寫入單行;

csvwriter.writerows(rows):寫入多行

import csv  # 模塊導入

csv_headers = ['name', 'age']
rows = [('橡皮擦', 18),
        ('發量迷人的喬喻', 19),
        ('各位博主', 20)]

with open('./aa.csv', 'w', encoding='utf-8',newline='') as f:
    csv_file = csv.writer(f)
    csv_file.writerow(csv_headers)  # 寫入頭
    csv_file.writerows(rows)

DictReader 類使用方法差不多,還存在一個 DictWriter 類,該類將以字段格式寫入 csv 文件字段。

import csv

with open('abc.csv', 'w', newline='') as csvfile:
    w = csv.DictWriter(csvfile, fieldnames=['sid', 'name', 'age'])
    w.writeheader()  # 寫入列頭
    w.writerow({'sid': '10010', 'name': '橡皮擦', 'age': 18})
    w.writerow({'sid': '10010', 'name': '橡皮擦', 'age': 18})
    w.writerow({'sid': '10010', 'name': '橡皮擦', 'age': 18})

上述代碼尤其註意 fieldnames 參數是必填參數,表示的是列頭,並且在寫入正式數據前,需使用 w.writeheader() 寫入列頭。

csv 文件其它說明

關於 csv 方言,可以使用 csv.register_dialect 方法將 namedialect 關聯起來,核心含義相當於給 dialect 起瞭一個別名。刪除也比較簡單,使用 csv.unregister_dialect(name) 即可。csv.list_dialects() 返回已經註冊的方言名稱,你可以在電腦上做一下測試,查看 Python 環境中提供的幾種方言。

import csv

csv.register_dialect('ca', delimiter='|', quoting=csv.QUOTE_MINIMAL)
with open('abc.csv', 'w', newline='') as csvfile:
    w = csv.DictWriter(csvfile, fieldnames=['sid', 'name', 'age'], dialect='ca')
    w.writeheader()  # 寫入列頭
    w.writerow({'sid': '10010', 'name': '橡皮擦', 'age': 18})
    w.writerow({'sid': '10010', 'name': '橡皮擦', 'age': 18})
    w.writerow({'sid': '10010', 'name': '橡皮擦', 'age': 18})

沒基礎,也可一文看懂 python 中的 csv 模塊

csv 模塊還提供瞭 csv.Sniffer 類,用於推斷 csv 文件的格式,其存在兩個方法:

sniff(sample, delimiters=None):分析並返回一個 dialect 子類,可以分析出格式參數;

has_header(sample):分析 csv 文件是否存在標題。

以上就是零基礎也能看懂的python內置csv模塊詳解的詳細內容,更多關於的python內置模塊csv的資料請關註WalkonNet其它相關文章!

推薦閱讀: