1. 程式人生 > >python中常見csv檔案讀取方法比較

python中常見csv檔案讀取方法比較

示例資料集:UCI的電離層(Ionosphere)

要實現的資料集的讀取功能:
該資料集共有351行,每行有35個值,前34個為我們要的資料集,最後一個值是’g’或者’b’,表示資料的好壞,我們的任務就是在這個文字資料的前34列分出來,得到我們要的資料data_set(陣列型別,元素為float),最後一列分出來,作為我們的標籤data_label(布林陣列型別)
實現這個功能有以下幾種方法

方法一: open函式

程式碼如下:

data_file='ionosphere.data'
data_set=np.zeros((351,34),dtype='float')
data_label=np.zeros((351,),dtype='bool')
fr=open(data_file)
array_of_line=fr.readlines()#得到文字的資料陣列
number_of_line=len(array_of_line)#得到文字行數
for line in array_of_line:
    list_from_line=line.split(',')
    datastr=list_from_line[:-1]#這裡得到的是字串型別,而非浮點型
    data=float(datastr)#轉化為浮點型
fr.close()#關閉文件

這個方法要注意的是:
(1)檔案的開啟和關閉需要我們處理,比較麻煩
(2)從文字中直接讀到的序列是字串,而非浮點型(雖然文字表面上看起來是浮點型),要獲取元素的型別可以直接用函式type(datastr[1])
文字內容看起來如下:
1,0,0.99539,-0.05889,0.85243,0.02306,0.83398,-0.37708,1,0.03760,0.85243,-0.17755,0.59755,-0.44945,0.60536,-0.38223,0.84356,-0.38542,0.58212,-0.32192,0.56971,-0.29674,0.36946,-0.47357,0.56811,-0.51171,0.41078,-0.46168,0.21266,-0.34090,0.42267,-0.54487,0.18641,-0.45300,g
1,0,1,-0.18829,0.93035,-0.36156,-0.10868,-0.93597,1,-0.04549,0.50874,-0.67743,0.34432,-0.69707,-0.51685,-0.97515,0.05499,-0.62237,0.33109,-1,-0.13151,-0.45300,-0.18056,-0.35734,-0.20332,-0.26569,-0.20468,-0.18401,-0.19040,-0.11593,-0.16626,-0.06288,-0.13738,-0.02447,b
1,0,1,-0.03365,1,0.00485,1,-0.12062,0.88965,0.01198,0.73082,0.05346,0.85443,0.00827,0.54591,0.00299,0.83775,-0.13644,0.75535,-0.08540,0.70887,-0.27502,0.43385,-0.12062,0.57528,-0.40220,0.58984,-0.22145,0.43100,-0.17365,0.60436,-0.24180,0.56045,-0.38238,g
1,0,1,-0.45161,1,1,0.71216,-1,0,0,0,0,0,0,-1,0.14516,0.54094,-0.39330,-1,-0.54467,-0.69975,1,0,0,1,0.90695,0.51613,1,1,-0.20099,0.25682,1,-0.32382,1,b
….

方法一: 用pythoncsv模組
程式碼如下:

with open(data_file,'r') as input_file:
reader=csv.reader(input_file)#reader是一個字串組成的序列,雖然檔案內容看起來是整形和浮點型
for i,row in enumerate(reader):
    #data=[float(datnum) for datnum in row[:-1]]
    print(i,row)

這個方法要注意的是:
(1)雖然文字內容看起來是像浮點型和整型,但是用csv模組讀進來後其實是一個字串的序列。所以要座顯示的型別轉換
(2)相比於上個方法,我們不用去關心文字的開啟與關閉,程式碼也是更為簡潔

方法二: 利用pandas的read_csv函式
程式碼如下:

result=pd.read_csv('ionosphere.data')
for i,row in enumerate(np.array(result)):
    data=[float(datnum) for datnum in row[:-1]]
    data_set[i]=data

這個方法要注意的是:
(1)讀進來的資料並不是字串型別,而是根據具體的內容自動做了調整,例如,data[1]中存的是1或者0,直接返回的是int型別,而其他則是浮點型。
(2)雖然這裡read_csv函式已經幫我們講非字串型別做了自動的轉換,但是這樣使得陣列同時存在整型和浮點型,我們還是全部轉化為浮點型的好,但是如果其他的文字存的都是相同型別的話,使用pandas的函式會使得文字處理變得格外容易