先看一下CSV文件的定義:
CSV(Comma-Separated Values,逗號分隔值,有時也稱為字符分隔值,因為分隔字符也可以不是逗號),其文件以純文本形式存儲表格數據(數字和文本)。
CSV 是一種通用的、相對簡單的文件格式,被用戶、商業和科學廣泛應用。
對於實際項目中,CSV文件是非常常見的數據格式,屬於結構化數據。當然,有的說法只把關系型數據庫中的數據當做結構化數據,而把CSV當做半結構化數據。但無論怎么分類,JSON、XML是比較標准的半結構化數據。而CSV數據與關系型數據更相近。甚至可以認為就是關系型數據表的文件表現形式。
python對於CSV文件的處理,是非常方便的。感覺與處理Excel文件類似,有兩大類方法。一種是按照文件方式進行讀寫,另一種是用pandas模塊處理。前一種方法與其他文本文件的處理方式類似,可以獲取CSV文件的所有數據,然后再按照取得的數據元素進行計算處理。而pandas屬於python用於數據分析的模塊,有更強大的數據處理能力。可以想象,在pandas處理中,CSV的數據如同矩陣一樣的數據塊。再結合pandas強大的各種數據分析工具可進行更加復雜的數據處理。
以下舉例說明:
data.csv:
id,name,age
0001,mike,30
0002,will,31
0003,alex,33
0004,john,34
0005,mark,32
0006,rose,31
0008,joan,33
0009,kelinton,34
0007,bush,32
一、按照文件方式讀寫CSV
1.讀取CSV文件:def csv_reader():
1 import csv 2 with open('data.csv', 'r') as f: 3 reader = csv.reader(f) 4 print(type(reader)) #>>><class '_csv.reader'> 5 reader_list=list(reader) 6 print(type(reader_list),reader_list) 7 #>>><class 'list'> [['id', 'name', 'age'], ['0001', 'mike', '30'], ['0002', 'will', '31'], ……,] 8 for i,line in enumerate(reader_list): 9 print("%s行:%s"%(i,line)) #可以把0行當做表頭head,其他作為數據行。
#>>>
0行:['id', 'name', 'age']
1行:['0001', 'mike', '30']
2行:['0002', 'will', '31']
3行:['0003', 'alex', '33']
4行:['0004', 'john', '34']
5行:['0005', 'mark', '32']
6行:['0006', 'rose', '31']
7行:['0008', 'joan', '33']
8行:['0009', 'kelinton', '34']
9行:['0007', 'bush', '32']
通過上面程序,可以看出,CSV的reader函數可以獲取CSV文件數據,但其本身是一個'_csv.reader'類對象,需要經過list轉換為列表。經過輸出后,該CSV文件就是一個嵌套的列表。每一行數據是一個list,然后各行綜合起來是一個大的list。輸出各行的數據如上面所示。
2.讀取、寫入CSV及TXT文件。這里比較一下用csv模塊寫入的csv文件與一般文本文件的寫入有何不同?
1 def csv_read_write(): 2 import csv 3 with open('data.csv', 'r') as f_r, \ 4 open('data_w.csv', 'w',newline='') as f_w, \ 5 open('data_w.txt', 'w') as f_wt: 6 reader = csv.reader(f_r) 7 writer = csv.writer(f_w) 8 for i in reader: 9 str=f"{i[0]},{i[1].title()},{i[2]}\n" 10 # #寫入csv,調用csv方法,如果數據以str形式,得到的是每個字符都以逗號分隔。 11 data=[i[0],i[1].title(),i[2]] #正如讀取csv獲取的是列表一樣,寫入csv也必須以列表的形式。 12 # print(data) 13 writer.writerow(data) 14 f_wt.write(str) #以一般文本的形式str寫入文件,與csv方法寫入列表的結果相同。
執行結果顯示,'data_w.csv' 與 'data_w.txt'內容完全一樣。這也就說明CSV文件本身就是文本文件格式,只不過是一種格式化的,用逗號分隔符分隔的文本文件。從使用角度,
寫入一般的文本文件不用import模塊,而如果用CSV模塊,就要按照CSV模塊的函數進行讀寫。
二、按照pandas模塊讀寫CSV
1 def pandas_csv(): 2 import pandas as pd 3 df = pd.read_csv('data.csv') 4 print(type(df.to_string()),"\n",df.to_string()) #1 5 print(type(df),"\n",df) #2 6 nme = ["Google", "Runoob", "Taobao", "Wiki"] 7 st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"] 8 ag = [90, 40, 80, 98] 9 # 字典 10 dict = {'name': nme, 'site': st, 'age': ag} 11 df = pd.DataFrame(dict) 12 # 保存 dataframe 13 df.to_csv('site.csv')
#1>>>type(df.to_string()),"\n",df.to_string()
<class 'str'>
id name age
0 1 mike 30
1 2 will 31
2 3 alex 33
3 4 john 34
4 5 mark 32
5 6 rose 31
6 8 joan 33
7 9 kelinton 34
8 7 bush 32
#2>>>type(df),"\n",df
<class 'pandas.core.frame.DataFrame'>
id name age
0 1 mike 30
1 2 will 31
2 3 alex 33
3 4 john 34
4 5 mark 32
5 6 rose 31
6 8 joan 33
7 9 kelinton 34
8 7 bush 32
以上的輸出內容完全一樣,只是df與df.string()的數據類型不一樣。而且,因為pandas是面向數據分析的,所以在讀取CSV文件數據之后,自動添加了一列數據,相當於索引,
可用於數據分析。
site.csv文件內容:
,name,site,age
0,Google,www.google.com,90
1,Runoob,www.runoob.com,40
2,Taobao,www.taobao.com,80
3,Wiki,www.wikipedia.org,98
可以看到,df.to_csv('site.csv'),dataframe 在寫入csv文件數據的時候也是自動增加了索引列。
用pandas模塊的info函數查看df的詳細信息:
1 import pandas as pd 2 df = pd.read_csv('data.csv') 3 print("df.info".center(20,'*')) 4 print(df.info())
#>>>獲取df的信息
******df.info*******
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8 #文件總共9行,從0到8
Data columns (total 3 columns): #文件總共3列
# Column Non-Null Count Dtype #各列的數據類型,# non-null,意思為非空的數據
--- ------ -------------- -----
0 id 9 non-null int64
1 name 9 non-null object
2 age 9 non-null int64
dtypes: int64(2), object(1)
memory usage: 344.0+ bytes
