1. 程式人生 > >使用 Python 讀寫 csv 檔案

使用 Python 讀寫 csv 檔案

非關係型資料庫中,以文件型的資料庫 MongoDB 最為著名。還有一個很好的全文檢索引擎 Elasticsearch,基本上也可以當做一個文件型的資料庫來使用。

建立 csv 檔案:

import csv

with open("./csv_tutotial.csv", "a") as fw:
    writer = csv.writer(fw)
    writer.writerow(["c1", "c2", "c3"])
    for x in range(10):
        writer.writerow([x, chr(ord('a') + x), 'aaa'])

這裡寫圖片描述

說明:1、這裡“a”表示,開啟檔案的方式為“追加”;
2、開啟這個 csv 檔案可以看到,字串沒有用 “” 號括起來;

想為字串增加雙引號,可以這樣寫:

writer = csv.writer(fw)

替換成

writer = csv.writer(fw, quoting=csv.QUOTE_NONNUMERIC)

csv 檔案可以使用的儲存模式,請參考下面的這張表:

這裡寫圖片描述

表 csv 檔案可以使用的儲存模式

csv 檔案可以使用的儲存模式 描述
QUOTE_ALL 為所有的欄增加雙引號包圍
QUOTE_MINIMAL 僅為包含特殊符號的欄增加雙引號包圍
QUOTE_NONNUMERIC 為所有非數字的欄增加雙引號包圍
QUOTE_NONE 在 reader() 函式中,表示不要去掉資料中的雙引號包圍

讀取 csv 檔案

讀取 csv 檔案:

from __future__ import print_function
import csv

with open("./csv_tutotial.csv", "r") as fr:
    # 這個方法返回的是迭代型別
    rows = csv.reader(fr)

    for row in rows:
        print(row)

列印結果:

['c1', 'c2', 'c3']
['0', 'a', 'aaa']
['1', 'b', 'aaa']
['2
', 'c', 'aaa'] ['3', 'd', 'aaa'] ['4', 'e', 'aaa'] ['5', 'f', 'aaa'] ['6', 'g', 'aaa'] ['7', 'h', 'aaa'] ['8', 'i', 'aaa'] ['9', 'j', 'aaa']

觀察可以發現:
1、原始的行資料按照逗號分隔被切分成了列表
2、Name 列中的雙引號也被去掉了
在 Python 程式設計中,我們從來都不提倡“重複造輪子”。

假設要讀取的檔案內容是這樣的:

c1|c2|c3
0|a|aaa
1|b|aaa
2|c|aaa
3|d|aaa
4|e|aaa
5|f|aaa
6|g|aaa
7|h|aaa
8|i|aaa
9|j|aaa

我們就需要處理方言,預設情況下,分割符號是“,”,我們想把分隔符號改成“|”,這件事情就叫做 csv 的方言。
使用的方法,我們可以在建立 csv 檔案的時候,“註冊”一下,這個操作相當於“設定”。

方言指定了解析或寫一個數據檔案時使用的所有記號。

csv.register_dialect("pipes", delimiter='|')

完整程式碼:

import csv

csv.register_dialect("pipes", delimiter="|")
with open("./csv_tutotial.csv", "r") as fr:
    rows = csv.reader(fr, dialect="pipes")

    for row in rows:
        print(row)

當然,在我們 insert 到 csv 檔案的時候,也可以這麼做:

import csv

csv.register_dialect("pipes", delimiter="|")
with open("./csv_tutotial.csv", "w") as fr:
    writer = csv.writer(fr, dialect="pipes")
    writer.writerow(['id', 'name', 'age'])
    for x in range(10):
        writer.writerow([x, chr(ord('a') + x), int(x) + 20])

總結:不論是在寫 csv 檔案還是在讀 csv 檔案的時候,一定要做兩件事情:
(1)csv.register_dialect("pipes", delimiter="|")
(2)writer = csv.writer(fr, dialect="pipes")

將讀取的內容轉換為字典

將讀取的內容轉換為字典,使用的 csv 的 DictReader() 方法。

import csv

with open("./csv_tutotial.csv", 'r') as fr:
    rows = csv.DictReader(fr)
    for row in rows:
        print(row)

帶方言的 csv 檔案讀法:

import csv

csv.register_dialect("pipes", delimiter="|")
with open("./csv_tutotial.csv", "r") as fr:
    rows = csv.DictReader(fr, dialect="pipes")
    for row in rows:
        print(row['id'], row.get('name'), row['age'])

讀取的結果是,第一行的永遠作為了 key

或者我們可以這樣說,csv.DictReader() 方法讀出來的資料,預設以第 1 行作為標記。

注意:如果在寫入檔案的時候,兩行之間會空出一行來,則需要修改如下:

with open("./csv_tutotial.csv", "w",newline='') as fr: