本文主要對Python如何讀取數據進行總結梳理,涵蓋從文本文件,尤爲是excel文件(用於離線數據探索分析),以及結構化數據庫(以Mysql爲例)中讀取數據等內容。php
約定:css
import numpy as np import pandas as pd
一、從文本文件中讀取
(1)使用Python標準庫中的read、readline、readlines方法讀取
a. 通常流程:
step1: 經過open方法建立一個文件對象
setp2: 經過read、readline、readlines方法讀取文件內容
step3: 經過close方法關閉文件對象
b. 區別:
示例:test.txt
html
read方法:讀取所有數據,結果爲一個字符串(全部行合併爲一個字符串)python
#打開文件 f = open('/labcenter/python/pandas/test.txt') #使用read方法讀取文件 data1 = f.read() print data1 type(data1) #關閉文件 f.close()
結果:mysql
col1 col2 col3 101 20 0.68 102 30 0.79 103 50 0.72 104 60 0.64 105 70 0.55 str
readline方法:讀取一行數據,結果爲一個字符串,須要seek\next等指針操做方法配合實現全部記錄的遍歷。nginx
#打開文件 f = open('/labcenter/python/pandas/test.txt') #使用readline方法讀取文件 data2 = f.readline() print data2 type(data2) #關閉文件 f.close()
結果:sql
col1 col2 col3 str
readlines方法:讀取所有數據,結構爲一個列表(一行爲列表中的一個元素)shell
#打開文件 f = open('/labcenter/python/pandas/test.txt') #使用readlines方法讀取文件 data3 = f.readlines() print data3 type(data3) for line in data3: print line #關閉文件 f.close()
結果:數據庫
['col1 col2 col3\r\n', '101 20 0.68\r\n', '102 30 0.79\r\n', '103 50 0.72\r\n', '104 60 0.64\r\n', '105 70 0.55'] list col1 col2 col3 101 20 0.68 102 30 0.79 103 50 0.72 104 60 0.64 105 70 0.55
c. 支持文件範圍:
txt\csv\tsv及全部以固定分隔符分隔的文本文件。json
(2)使用Numpy庫中的loadtxt、load、fromfile方法讀取
a. loadtxt方法
從txt文本文件中讀取,返回一個數組。
np.loadtxt('/labcenter/python/pandas/test.txt',skiprows=1)
Out[413]:
array([[ 101. , 20. , 0.68],
[ 102. , 30. , 0.79],
[ 103. , 50. , 0.72],
[ 104. , 60. , 0.64],
[ 105. , 70. , 0.55]])
b. load方法
讀取Numpy專用的二進制數據文件,該文件一般基於Numpy的save或savez方法生成。
write = np.array([[1,2,3,4],[5,6,7,8]]) np.save('output',write) data = np.load('output.npy') print data type(data)
結果:
[[1 2 3 4] [5 6 7 8]] numpy.ndarray
c. fromfile方法
讀取簡單的文本文件和二進制文件,該文件一般基於Numpy的tofile方法生成。
write = np.array([[1,2,3,4],[5,6,7,8]]) write.tofile('output') data = np.fromfile('output',dtype='float32') print data type(data)
結果:
[ 1.40129846e-45 0.00000000e+00 2.80259693e-45 ..., 0.00000000e+00 1.12103877e-44 0.00000000e+00] numpy.ndarray
(3)使用Pandas庫中的read_csv、read_table、read_excel等方法讀取
a. read_csv方法
讀取csv文件,返回一個DataFrame對象或TextParser對象。
示例:
test.csv
data = pd.read_csv('/labcenter/python/pandas/test.csv') print data type(data)
結果:
col1 col2 col3 0 101 20 0.68 1 102 30 0.79 2 103 50 0.72 3 104 60 0.64 4 105 70 0.55 pandas.core.frame.DataFrame
b. read_table方法
讀取通用分隔符分隔的文本文件,返回一個DataFrame對象或TextParser對象。
data = pd.read_table('/labcenter/python/pandas/test.csv',sep=',') print data type(data)
結果:
col1 col2 col3 0 101 20 0.68 1 102 30 0.79 2 103 50 0.72 3 104 60 0.64 4 105 70 0.55 pandas.core.frame.DataFrame
c. read_excel方法
讀取excel文件,返回一個DataFrame對象或TextParser對象。
示例:
test.xlsx
data = pd.read_excel('/labcenter/python/pandas/test.xlsx') print data type(data)
結果:
col1 col2 col3 0 101 21 22.6 1 102 31 31.2 2 103 41 32.7 3 104 51 28.2 4 105 61 18.9 pandas.core.frame.DataFrame
d. 其餘方法
read_sql方法:讀取sql請求或者數據庫中的表。
read_json方法:讀取json文件。
(4)如何選擇?
a. 選取本身最熟悉的方法。
b. 根據場景選擇:
① 對純文本、非結構化的數據:標準庫的三種方法
② 對結構化、數值型,而且要用於矩陣計算、數據建模的:Numpy的loadtxt方法
③ 對於二進制數據:Numpy的load和fromfile方法
④ 對於結構化的數據,而且要用於數據探索分析的:Pandas方法
二、從Excel文件中讀取
excel每每是在進行離線數據探索分析時提供的數據文件格式,所以這裏單獨拿出來多總結一下。
(1)使用Pandas庫的read_excel方法
見上文1.3.c內容。
(2)使用其餘第三方庫
以xlrd庫爲例, xlrd模塊實現對excel文件內容讀取。
import xlrd #打開一個excel文件 xlsx=xlrd.open_workbook('/labcenter/python/pandas/test.xlsx') #讀取sheet清單 sheets=xlsx.sheet_names() sheets #獲取一個sheet數據 sheet1=xlsx.sheets()[0] #獲取指定sheet的名稱 sheet1.name #獲取指定sheet的行數 sheet1.nrows #獲取指定sheet的列數 sheet1.ncols #獲取指定sheet某行的數據 sheet1.row_values(1) #獲取指定sheet某列的數據 sheet1.col_values(1) #獲取指定sheet某單元格的數據 sheet1.row(1)[2].value sheet1.cell_value(1,2) #逐行獲取指定sheet的數據 for i in range(sheet1.nrows): print sheet1.row_values(i)
結果:
[u'Sheet1', u'Sheet2'] u'Sheet1' 6 3 [101.0, 21.0, 22.6] [u'col2', 21.0, 31.0, 41.0, 51.0, 61.0] 22.6 22.6 [u'col1', u'col2', u'col3'] [101.0, 21.0, 22.6] [102.0, 31.0, 31.2] [103.0, 41.0, 32.7] [104.0, 51.0, 28.2] [105.0, 61.0, 18.9]
三、從結構化數據庫中讀取
根據數據庫選擇相應的庫,如:mysql數據庫使用MySQLdb庫,oracle數據庫使用cx_Oracle庫,teradata數據庫使用teradata庫,等等。
通常流程:
step1: 創建數據庫鏈接
step2: cursor方法獲取遊標
step3: execute方法執行SQL語句
step4: fetchall方法獲取返回的記錄
step5: close方法關閉遊標
step6: close方法斷開數據庫鏈接
示例:
import MySQLdb
#創建數據庫鏈接 conn = MySQLdb.connect("localhost", "root", "root", "testdb", charset='utf8') #獲取遊標 cursor = conn.cursor() #執行SQL語句 cursor.execute("select * from mytab1;") #獲取返回的記錄 results = cursor.fetchall() #逐行打印 for result in results: print result #關閉遊標 cursor.close() #斷開數據庫鏈接 conn.close()
結果:
(1L, u'aaa') (2L, u'bbb') (3L, u'ccc') (4L, u'ddd') (5L, u'eee')
可經過命令pip install MySql-Python
安裝庫MySQLdb。
4.參考與感謝
[1] Python數據分析與數據化運營