Python加載文件內容的兩種實現方式
說到機器學習,大傢首先想到的可能就是Python和算法瞭,其實光有Python和算法是不夠的,數據才是進行機器學習的前提。
大多數的數據都會存儲在文件中,要想通過Python調用算法對數據進行相關學習,首先就要將數據讀入程序中,本文介紹兩種加載數據的方式,在之後的算法介紹中,將頻繁使用這兩種方式將數據加載到程序。
下面我們將以Logistic Regression模型加載數據為例,分別對兩種不同的加載數據的方式進行介紹。
一、利用open()函數進行加載
def load_file(file_name): ''' 利用open()函數加載文件 :param file_name: 文件名 :return: 特征矩陣、標簽矩陣 ''' f = open(file_name) # 打開訓練數據集所在的文檔 feature = [] # 存放特征的列表 label = [] #存放標簽的列表 for row in f.readlines(): f_tmp = [] # 存放特征的中間列表 l_tmp = [] # 存放標簽的中間列表 number = row.strip().split("\t") # 按照\t分割每行的元素,得到每行特征和標簽 f_tmp.append(1) # 設置偏置項 for i in range(len(number) - 1): f_tmp.append(float(number[i])) l_tmp.append(float(number[-1])) feature.append(f_tmp) label.append(l_tmp) f.close() # 關閉文件,很重要的操作 return np.mat(feature), np.mat(label)
二、利用Pandas庫中的read_csv()方法進行加載
def load_file_pd(path, file_name): ''' 利用pandas庫加載文件 :param path: 文件路徑 :param file_name: 文件名稱 :return: 特征矩陣、標簽矩陣 ''' feature = pd.read_csv(path + file_name, delimiter="\t", header=None, usecols=[0, 1]) feature.columns = ["a", "b"] feature = feature.reindex(columns=list('cab'), fill_value=1) label = pd.read_csv(path + file_name, delimiter="\t", header=None, usecols=[2]) return feature.values, label.values
三、示例
我們可以使用上述的兩種方法加載部分數據進行測試,數據內容如下:
數據分為三列,前兩列是特征,最後一列是標簽。
加載數據代碼如下:
''' 兩種方式加載文件 ''' import pandas as pd import numpy as np def load_file(file_name): ''' 利用open()函數加載文件 :param file_name: 文件名 :return: 特征矩陣、標簽矩陣 ''' f = open(file_name) # 打開訓練數據集所在的文檔 feature = [] # 存放特征的列表 label = [] #存放標簽的列表 for row in f.readlines(): f_tmp = [] # 存放特征的中間列表 l_tmp = [] # 存放標簽的中間列表 number = row.strip().split("\t") # 按照\t分割每行的元素,得到每行特征和標簽 f_tmp.append(1) # 設置偏置項 for i in range(len(number) - 1): f_tmp.append(float(number[i])) l_tmp.append(float(number[-1])) feature.append(f_tmp) label.append(l_tmp) f.close() # 關閉文件,很重要的操作 return np.mat(feature), np.mat(label) def load_file_pd(path, file_name): ''' 利用pandas庫加載文件 :param path: 文件路徑 :param file_name: 文件名稱 :return: 特征矩陣、標簽矩陣 ''' feature = pd.read_csv(path + file_name, delimiter="\t", header=None, usecols=[0, 1]) feature.columns = ["a", "b"] feature = feature.reindex(columns=list('cab'), fill_value=1) label = pd.read_csv(path + file_name, delimiter="\t", header=None, usecols=[2]) return feature.values, label.values if __name__ == "__main__": path = "C://Users//Machenike//Desktop//xzw//" feature, label = load_file(path + "test.txt") feature_pd, label_pd = load_file_pd(path, "test.txt") print(feature) print(feature_pd) print(label) print(label_pd)
測試結果:
[[ 1. 1.43481273 4.54377111]
[ 1. 5.80444603 7.72222239]
[ 1. 2.89737803 4.84582798]
[ 1. 3.48896827 9.42538199]
[ 1. 7.98990181 9.38748992]
[ 1. 6.07911968 7.81580716]
[ 1. 8.54988938 9.83106546]
[ 1. 1.86253147 3.64519173]
[ 1. 5.09264649 7.16456405]
[ 1. 0.64048734 2.96504627]
[ 1. 0.44568267 7.27017831]]
[[ 1. 1.43481273 4.54377111]
[ 1. 5.80444603 7.72222239]
[ 1. 2.89737803 4.84582798]
[ 1. 3.48896827 9.42538199]
[ 1. 7.98990181 9.38748992]
[ 1. 6.07911968 7.81580716]
[ 1. 8.54988938 9.83106546]
[ 1. 1.86253147 3.64519173]
[ 1. 5.09264649 7.16456405]
[ 1. 0.64048734 2.96504627]
[ 1. 0.44568267 7.27017831]]
[[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]]
[[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]]
從測試結果來看可知兩種加載數據的方法得到的數據結果是一樣的,故兩種方法均適用於加載數據。
註意:
此處是以Logistic Regression模型加載數據為例,數據與數據本身或許會有差異,但加載數據的方式都是大同小異的,要靈活變通。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Python Pandas讀取csv/tsv文件(read_csv,read_table)的區別
- python中pandas讀取csv文件時如何省去csv.reader()操作指定列步驟
- Python 如何讀取.txt,.md等文本文件
- 教你利用python如何讀取txt中的數據
- python數學建模之三大模型與十大常用算法詳情