CSV,全稱爲Comma-Separated Values,中文能夠叫做逗號分隔值或字符分隔值,其文件以純文本形式存儲表格數據。該文件是一個字符序列,能夠由任意數目的記錄組成,記錄間以某種換行符分隔。每條記錄由字段組成,字段間的分隔符是其餘字符或字符串,最多見的是逗號或製表符。不過全部記錄都有徹底相同的字段序列,至關於一個結構化表的純文本形式。它比Excel文件更加簡介,XLS文本是電子表格,它包含了文本、數值、公式和格式等內容,而CSV中不包含這些內容,就是特定字符分隔的純文本,結構簡單清晰。因此,有時候用CSV來保存數據是比較方便的。本節中,咱們來說解Python讀取和寫入CSV文件的過程。html
這裏先看一個最簡單的例子:bash
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打開的結果如圖5-6所示。函數
圖5-6 打開結果ui
若是想修改列與列之間的分隔符,能夠傳入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
爲空格,此時輸出結果的每一列就是以空格分隔了,內容以下:spa
id name age
10001 Mike 20
10002 Bob 22
10003 Jordan 21
複製代碼
另外,咱們也能夠調用writerows()
方法同時寫入多行,此時參數就須要爲二維列表,例如:code
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]])
複製代碼
輸出效果是相同的,內容以下:cdn
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': 22})
複製代碼
這裏須要給open()
函數指定編碼,不然可能發生編碼錯誤。
另外,若是接觸過pandas等庫的話,能夠調用DataFrame
對象的to_csv()
方法來將數據寫入CSV文件中。
咱們一樣可使用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', '王偉', '22']
複製代碼
這裏咱們構造的是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 王偉 22
複製代碼
在作數據分析的時候,此種方法用得比較多,也是一種比較方便地讀取CSV文件的方法。
本節中,咱們瞭解了CSV文件的寫入和讀取方式。這也是一種經常使用的數據存儲方式,須要熟練掌握。
本資源首發於崔慶才的我的博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注個人我的微信公衆號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)