CSV,全稱為Comma-Separated Values,中文可以叫作逗號分隔符或字元分隔值,其檔案以純文字形式儲存表格資料。該檔案時一個字元序列,可以由任意數目的記錄組成,記錄間以某種換行符分隔。每條記錄由欄位組成,欄位間的分隔符是其他字元或字串,最常見的是逗號或製表符。不過所有記錄都有完全相同的欄位序列,相當於一個結構化表的純文字形式。它比Excel檔案更加簡潔,XLS文字是電子表格,它包含了文字、數值、公式和格式等內容,而CSV中不包含這些內容,就是特定字元分隔的純文字,結構簡單清晰。所以,有時候CSV來儲存資料是比較方便的。

寫入

import csv

with open('data.csv', 'w') as csvfile:
	writer = csv.writer(csvfile)
	writer.writerow(['id', 'name', 'age'])
	writer.writerow(['10001', 'Mike', 20])
	writer.writerow(['10002', 'Bob', 22])
	writer.writerow(['10003', 'Jordan', 21])

首先,開啟data.csv檔案,然後指定開啟的模式為w(即寫入),獲得檔案控制代碼,隨後呼叫csv庫的writer()方法初始化寫入物件,傳入該控制代碼,然後呼叫writerow()方法傳入每行的資料即可完成寫入。
執行結束後,會生成一個名為data.csv的檔案,此時資料就成功寫入了。直接以文字形式開啟的話,其內容如下:

id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21

可以看到,寫入的文字預設以逗號分隔,呼叫一次writerow()方法即可寫入一行資料。用Excel開啟的結果如圖:
在這裡插入圖片描述
如果想修改列與列之間的分隔符,可以傳入delimiter引數,其程式碼如下:

import csv

with open('data.csv', 'w') as csvfile:
	writer = csv.writer(csvfile, delimiter=' ')
	writer.writerow(['id', 'name', 'age'])
	writer.writerow(['10001', 'Mike', 20])
	writer.writerow(['10002', 'Bob', 22])
	writer.writerow(['10003', 'Jordan', 21])

這裡在初始化寫入物件時傳入delimiter為空格,此時輸出結果的每一列就是以空格分隔了,內容如下:

id name age
10001 Mike 20
10002 Bob 22
10003 Jordan 21

另外,我們也可以呼叫writerows()方法同時寫入多行,此時引數就需要為二維列表,例如:

import csv

with open('data.csv', 'w') as csvfile:
	writer = csv.writer(csvfile)
	writer.writerow(['id', 'name', 'age'])
	writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])

輸出效果是相同的,內容如下:

id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21

但是一般情況下,爬蟲爬取的都是結構化資料,我們一般會用字典來表示。在csv庫中也提供了字典的寫入方式,示例如下:

import csv

with open('data.csv', 'w') as csvfile:
	fieldnames = ['id', 'name', 'age']
	writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
	writer.writeheader()
	writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
	writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
	writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})

這裡先定義3個欄位,用fieldnames表示,然後將其傳給DictWriter來初始化一個字典寫入物件,接著可以呼叫writeheader()方法先寫入頭資訊,然後再呼叫writerow()方法傳入相應字典即可。最終寫入的結果是相同的,內容如下:

id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21

這樣就可以完成字典到CSV檔案的寫入了。
另外,如果想追加寫入的話,可以修改檔案的開啟模式,即將open()函式的第二個引數改成a,程式碼如下:

import csv

with open('data.csv', 'a') as csvfile:
	fieldnames = ['id', 'name', 'age']
	writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
	writer.writerow({'id': '10004', 'name': 'Durant', 'age': 22})

這樣在上面的基礎上再執行這段程式碼,檔案內容便會變成:

id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21
10004,Durant,22

可見,資料被追加寫入到檔案中。
如果要寫入中文內容的話,可能會遇到字元編碼的問題,此時需要給open()引數指定編碼格式。比如,這裡再寫入一行包含中文的資料,程式碼需要改寫如下:

import csv

with open('data.csv', 'a', encoding='utf-8') as csvfile:
	fieldnames = ['id', 'name', 'age']
	writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
	writer.writerow({'id': '10005', 'name': '王偉', 'age': 21})

這裡需要給open()函式指定編碼,否則可能發現編碼錯誤。

讀取

我們可以使用csv庫來讀取CSV檔案。

import csv

with open('data.csv', 'r', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)

執行結果如下:

['id', 'name', 'age']
['10001', 'Mike', '20']
['10002', 'Bob', '22']
['10003', 'Jordan', '21']
['10004', 'Durant', '22']
['10005', '王偉', '21']

這裡我們構造的是Reader物件,通過遍歷輸出了每行的內容,每一行都是一個列表形式。注意,如果CSV檔案中包含中文的話,還需要制定檔案編碼。
另外,如果接觸過pandas的話,可以利用read_csv()方法將資料從CSV中讀取出來,例如:

import pandas as pd

df = pd.read_csv('data.csv')
print(df)

執行結果如下:

      id    name  age
0  10001    Mike   20
1  10002     Bob   22
2  10003  Jordan   21
3  10004  Durant   22
4  10005    王偉   21