使用 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: