CSV,全稱為Comma-Separated Values,中文可以叫作逗號分隔值或字符分隔值,其文件以純文本形式存儲表格數(shù)據(jù)。該文件是一個字符序列,可以由任意數(shù)目的記錄組成,記錄間以某種換行符分隔。每條記錄由字段組成,字段間的分隔符是其他字符或字符串,最常見的是逗號或制表符。不過所有記錄都有完全相同的字段序列,相當(dāng)于一個結(jié)構(gòu)化表的純文本形式。它比Excel文件更加簡介,XLS文本是電子表格,它包含了文本、數(shù)值、公式和格式等內(nèi)容,而CSV中不包含這些內(nèi)容,就是特定字符分隔的純文本,結(jié)構(gòu)簡單清晰。所以,有時候用CSV來保存數(shù)據(jù)是比較方便的。本節(jié)中,我們來講解Python讀取和寫入CSV文件的過程。
1. 寫入
這里先看一個最簡單的例子:
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(即寫入),獲得文件句柄,隨后調(diào)用csv庫的writer()方法初始化寫入對象,傳入該句柄,然后調(diào)用writerow()方法傳入每行的數(shù)據(jù)即可完成寫入。
運行結(jié)束后,會生成一個名為data.csv的文件,此時數(shù)據(jù)就成功寫入了。直接以文本形式打開的話,其內(nèi)容如下:
id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21
可以看到,寫入的文本默認(rèn)以逗號分隔,調(diào)用一次writerow()方法即可寫入一行數(shù)據(jù)。用Excel打開的結(jié)果如圖5-6所示。
如果想修改列與列之間的分隔符,可以傳入delimiter參數(shù),其代碼如下:
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為空格,此時輸出結(jié)果的每一列就是以空格分隔了,內(nèi)容如下:
id name age
10001 Mike 20
10002 Bob 22
10003 Jordan 21
另外,我們也可以調(diào)用writerows()方法同時寫入多行,此時參數(shù)就需要為二維列表,例如:
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]])
輸出效果是相同的,內(nèi)容如下:
id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21
但是一般情況下,爬蟲爬取的都是結(jié)構(gòu)化數(shù)據(jù),我們一般會用字典來表示。在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來初始化一個字典寫入對象,接著可以調(diào)用writeheader()方法先寫入頭信息,然后再調(diào)用writerow()方法傳入相應(yīng)字典即可。最終寫入的結(jié)果是完全相同的,內(nèi)容如下:
id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21
這樣就可以完成字典到CSV文件的寫入了。
另外,如果想追加寫入的話,可以修改文件的打開模式,即將open()函數(shù)的第二個參數(shù)改成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})
這樣在上面的基礎(chǔ)上再執(zhí)行這段代碼,文件內(nèi)容便會變成:
id,name,age
10001,Mike,20
10002,Bob,22
10003,Jordan,21
10004,Durant,22
可見,數(shù)據(jù)被追加寫入到文件中。
如果要寫入中文內(nèi)容的話,可能會遇到字符編碼的問題,此時需要給open()參數(shù)指定編碼格式。比如,這里再寫入一行包含中文的數(shù)據(jù),代碼需要改寫如下:
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()函數(shù)指定編碼,否則可能發(fā)生編碼錯誤。
另外,如果接觸過pandas等庫的話,可以調(diào)用DataFrame對象的to_csv()方法來將數(shù)據(jù)寫入CSV文件中。
2. 讀取
我們同樣可以使用csv庫來讀取CSV文件。例如,將剛才寫入的文件內(nèi)容讀取出來,相關(guān)代碼如下:
import csv
with open('data.csv', 'r', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)
運行結(jié)果如下:
['id', 'name', 'age']
['10001', 'Mike', '20']
['10002', 'Bob', '22']
['10003', 'Jordan', '21']
['10004', 'Durant', '22']
['10005', '王偉', '22']
這里我們構(gòu)造的是Reader對象,通過遍歷輸出了每行的內(nèi)容,每一行都是一個列表形式。注意,如果CSV文件中包含中文的話,還需要指定文件編碼。
另外,如果接觸過pandas的話,可以利用read_csv()方法將數(shù)據(jù)從CSV中讀取出來,例如:
import pandas as pd
df = pd.read_csv('data.csv')
print(df)
運行結(jié)果如下:
id name age
0 10001 Mike 20
1 10002 Bob 22
2 10003 Jordan 21
3 10004 Durant 22
4 10005 王偉 22
在做數(shù)據(jù)分析的時候,此種方法用得比較多,也是一種比較方便地讀取CSV文件的方法。
初級會計職稱中級會計職稱經(jīng)濟師注冊會計師證券從業(yè)銀行從業(yè)會計實操統(tǒng)計師審計師高級會計師基金從業(yè)資格稅務(wù)師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價格鑒證師統(tǒng)計資格從業(yè)
一級建造師二級建造師消防工程師造價工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測工程師建筑八大員注冊建筑師二級造價師監(jiān)理工程師咨詢工程師房地產(chǎn)估價師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評價土地登記代理公路造價師公路監(jiān)理師化工工程師暖通工程師給排水工程師計量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會工作者司法考試職稱計算機營養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護士資格證初級護師主管護師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗技師臨床醫(yī)學(xué)理論中醫(yī)理論