Python 讀取txt、csv、mat資料並載入到陣列
一、txt檔案資料載入到陣列
這裡結合上一篇博文的資料來講怎麼方便的載入.txt檔案到一個數組,資料如下所示:
1、自己寫Python程式碼實現txt文字資料讀取並載入成陣列形式(PS:下面給了三種方法,選擇理解)
# -*- coding: cp936 -*- import re import linecache import numpy as np import os filename = 'preprocess1.txt' #數值文字檔案轉換為雙列表形式[[...],[...],[...]],即動態二維陣列 #然後將雙列表形式通過numpy轉換為陣列矩陣形式 def txt_strtonum_feed(filename): data = [] with open(filename, 'r') as f:#with語句自動呼叫close()方法 line = f.readline() while line: eachline = line.split()###按行讀取文字檔案,每行資料以列表形式返回 read_data = [ float(x) for x in eachline[0:7] ] #TopN概率字元轉換為float型 lable = [ int(x) for x in eachline[-1] ]#lable轉換為int型 read_data.append(lable[0]) #read_data = list(map(float, eachline)) data.append(read_data) line = f.readline() return data #返回資料為雙列表形式 #數值文字檔案直接轉換為矩陣陣列形式方法二 def txt_to_matrix(filename): file=open(filename) lines=file.readlines() #print lines #['0.94\t0.81\t...0.62\t\n', ... ,'0.92\t0.86\t...0.62\t\n']形式 rows=len(lines)#檔案行數 datamat=np.zeros((rows,8))#初始化矩陣 row=0 for line in lines: line=line.strip().split('\t')#strip()預設移除字串首尾空格或換行符 datamat[row,:]=line[:] row+=1 return datamat #數值文字檔案直接轉換為矩陣陣列形式方法三 def text_read(filename): # Try to read a txt file and return a matrix.Return [] if there was a mistake. try: file = open(filename,'r') except IOError: error = [] return error content = file.readlines() rows=len(content)#檔案行數 datamat=np.zeros((rows,8))#初始化矩陣 row_count=0 for i in range(rows): content[i] = content[i].strip().split('\t') datamat[row_count,:] = content[i][:] row_count+=1 file.close() return datamat if __name__ == '__main__': test_content = txt_strtonum_feed('preprocess1.txt') content = np.array(test_content) print content #矩陣陣列形式 print '\n' print test_content #二維列表 data = txt_to_matrix(filename) print data out = text_read('preprocess1.txt') print out
程式碼編譯所得結果如下圖所示(其中方法一思路是先得到動態二維陣列,即二維列表的形式,最後在mian函式裡使用np.arry()函式將其轉換為陣列形式,這裡將兩種形式結果都輸出):
2、呼叫numpy中loadtxt()
函式快速實現。(並且可以通過設定引數選取部分對應列資料載入陣列,具體詳細實踐可以參考以下博文地址:https://www.cnblogs.com/hecc/p/8480532.html,具體結果可以就不展示)
import numpy as np import os data1=np.loadtxt('preprocess1.txt',delimiter='\t') #delimiter引數依據原始文字資料每行數字之間符號,這裡為\t np.savetxt("data3.txt",data1,fmt="%5.3f",delimiter="\t",newline=os.linesep) #將讀取的檔案儲存到另一文字
二、CSV檔案資料載入到陣列
在一些資料競賽裡面碰到很多的資料都是.csv檔案給出的,說明應用應該還是有一些廣泛。首先這裡csv檔案編碼格式必須為UTF-8,否則會報編碼錯誤資訊。(txt轉csv檔案流程:開啟excel—>資料—>匯入文字/csv—>編碼格式選擇UTF-8—>儲存選擇csv格式)。csv檔案開啟如下所示:
首先python內建了csv庫,可以呼叫然後自己手動來寫操作的程式碼,比較簡單的csv檔案讀取載入到陣列可以採用python的pandas庫中的read_csv()
函式來讀取。其中函式的具體引數很長,在此忽略,詳細參考專業api文件。這裡程式碼實現及結果如下所示:
import numpy as np
import pandas as pd
import os
#UTF-8編碼格式csv檔案資料讀取
df = pd.read_csv('preprocess.csv') #返回一個DataFrame的物件,這個是pandas的一個數據結構
df.columns=["Col1","Col2","Col3","Col4","Col5","Col6","Col7","Col8"]
X = df[["Col1","Col2","Col3","Col4","Col5","Col6","Col7"]] #抽取前七列作為訓練資料的各屬性值
X = np.array(X)
print X
y1 = df["Col8"] #最後一列作為每行對應的標籤label
#Y = df["Col8"].map(lambda y1:float(y1.rstrip(";")))
Y = np.array(y1)
print Y
三、mat檔案資料載入到陣列
.mat檔案是MATLAB儲存資料的標準格式,很多的機器學習任務用.MAT來存出資料檔案。python的scipy中有專門的函式來方便.mat的檔案的載入和儲存,具體函式如下所示,實現就一行程式碼這裡就不展示了,可以自行參考其他資料。
scipy.io.loadmat(file_name, mdict=None, appendmat=True, **kwargs) #載入MATLAB檔案
#儲存一個帶有名稱和序列的字典到.mat檔案中
scipy.io.savemat(file_name, mdict, appendmat=True, format=’5’, long_field_names=False, do_compression=False, oned_as=’row’)