一,簡介
CSV,全稱Comma—Separated Values,可以稱為逗號分隔或者字符分隔值,其文件以純文本形式存儲表格數據。該文件是一個字符序列,可以有任意的數目記錄組成,記錄間已某種換行符分隔。每條記錄由字段組成,字段間的分隔符是其他字符或字符串,最常見的是逗號或制表符。相比EXcel更加簡潔,就是特定字符分隔的純文本。
二,寫入CSV文件
1.簡單的例子:
import csv with open('data.csv', 'w') as f: writer = csv.writer(f) writer.writerow(['id', 'name', 'age']) writer.writerow(['1', 'rain', '20']) writer.writerow(['2', 'godric', '22']) writer.writerow(['3', 'tony', '25'])
運行結束后會生成一個data.csv的文件,此時數據就成功寫入了。直接以文本形式打開,會顯示如下內容:
id,name,age
1,rain,20
2,godric,22
3,tony,25
可以看到寫入的文本默認以逗號分隔,調用一次writer()方法就會寫入一行數據。使用Excel打開:
如果想要修改列與列之間的分隔符,使用delimiter參數:
# 修改分隔符 with open('data.csv', 'w') as f: writer = csv.writer(f, delimiter="-") writer.writerow(['id', 'name', 'age']) writer.writerow(['1', 'rain', '20']) writer.writerow(['2', 'godric', '22']) writer.writerow(['3', 'tony', '25'])
使用純文本格式打開:
id-name-age
1-rain-20
2-godric-22
3-tony-25
另外,writer()方法也可以多行寫入,其結果是一樣的:
writer.writerow(['1', 'rain', '20'],['2', 'rain', '20'],['3', 'rain', '20'])
2.寫入字典
但是一般情況下,爬蟲爬取的都是結構化數據,我們一般會用字典來表示。csv中的字典寫入方式:
# 字典寫入 with open('data.csv', 'w') as f: field_name = ['id', 'name', 'age'] writer = csv.DictWriter(f, fieldnames=field_name) writer.writeheader() writer.writerow({'id': '1', 'name': 'rain', 'age': '20'}) writer.writerow({'id': '2', 'name': 'godric', 'age': '22'}) writer.writerow({'id': '3', 'name': 'tony', 'age': '25'})
這里先定義3個字段,使用field_name來表示,然后將其傳給DictWriter來初始化一個字典寫入對象,再使用writeheader()方法寫入頭信息,最后調用writerow()方法寫入字典即可。結果和上面的一樣。
3.追加內容
如果想要在文件后面追加內容,將open()函數的第二個參數改為a即可:
# 追加 with open('data.csv', 'a') as f: field_name = ['id', 'name', 'age'] writer = csv.DictWriter(f, fieldnames=field_name) writer.writeheader() writer.writerow({'id': '4', 'name': 'thor', 'age': '1000'})
結果如下:
id,name,age 1,rain,20 2,godric,22 3,tony,25 id,name,age 4,thor,1000
4.寫入中文
如果需要寫入中文信息,此時要指定編碼格式,否則可能會發生編碼錯誤。
# 中文需要指定編碼 with open('data.csv', 'a', encoding='utf-8') as f: field_name = ['id', 'name', 'age'] writer = csv.DictWriter(f, fieldnames=field_name) writer.writeheader() writer.writerow({'id': '5', 'name': '王翔', 'age': '22'})
結果如下:
id,name,age 1,rain,20 2,godric,22 3,tony,25 id,name,age 4,thor,1000 id,name,age 5,王翔,22
5.去除空行
在寫入文件的時候會像上面出現多余的空行,這時候可以在open()函數內添加,一個參數來去掉多余的空行newline='',以字典寫入為例:
with open('data.csv', 'w', newline='') as f: field_name = ['id', 'name', 'age'] writer = csv.DictWriter(f, fieldnames=field_name) writer.writeheader() writer.writerow({'id': '1', 'name': 'rain', 'age': '20'}) writer.writerow({'id': '2', 'name': 'godric', 'age': '22'}) writer.writerow({'id': '3', 'name': 'tony', 'age': '25'})
結果:
['id', 'name', 'age'] ['1', 'rain', '20'] ['2', 'godric', '22'] ['3', 'tony', '25']
二,讀取文件
同樣適用csv來讀取文件。讀取剛才寫入的文件:
# 文件讀取 with open('data.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: print(row)
讀取結果:
['id', 'name', 'age'] ['1', 'rain', '20'] ['2', 'godric', '22'] ['3', 'tony', '25']
這里我們構造了Reader對象,通過遍歷輸出了每一行內容,每一方都是一個列表形式。如果內容包含中文,需要指定編碼。
此外,還可以使用pandas讀取文件:
import pandas as pd data = pd.read_csv('data.csv') print(data)
結果:
id name age
0 1 rain 20
1 2 godric 22
2 3 tony 25
使用pandas可以快捷的讀取csv文件內容,數據分析時使用此方法較多。