1. 程式人生 > >Python 讀取txt、csv、mat資料並載入到陣列

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’)