Python數據處理 I:數據的讀取與存儲
簡介:Python是一種面向對象的解釋型計算機腳本語言。即使對於半導體從業人員,掌握一門腳本語言對於工程數據的處理也是十分有幫助的。今天我們就來說一說如何用Python進行數據的讀取和存儲。
標籤:計算機技術,Python
人生苦短,我用Python。 —— 魯迅
引 子:
在半導體製造公司里,每天都會產生數以億計的生產和測試數據。採用自動化的腳本語言對生產測試數據進行批量,將大大提高工程師的工作效率。雖然Perl語言在半導體製造公司內具有更高的普及率,但是隨著大數據和人工智慧技術的不斷發展,Python受到了越來越高的重視,因此我選擇了Python作為數據處理的腳本工具。
平台:Windows系統,Spyder 3.1.4 軟體,Python 3.6 環境。
這個系列包括如下3部分:
1. 數據的讀取與存儲
2. 數據的清洗(預處理)3. 數據的處理方法簡介
今天,我們先說一說數據的讀取和存儲。
實現數據處理,首先要能讓python讀取本地的數據文件。
通常來說,數據都保存在Excel表格里,我們可以使用xlrd庫來讀取Excel表格中的數據,用xlwt庫將處理後的數據保存為Excel文件。更一般的情況下,我推薦大家使用pandas庫的read_xxx函數(常用的諸如read_excel、read_csv、read_sql_query等)來讀取數據。 此外,通過os庫可以指定文件位置、循環遍歷文件夾中的全部數據文件,實現數據的批量處理。本文的主要內容:
1. xlwt庫和xlrd庫
2. 用pandas庫讀取和存儲數據3. 標籤型文本的處理:beautifulsoup4. 用os庫實現數據批量處理
1. xlwt庫和xlrd庫
用xlrd庫讀取數據的基本步驟:
① 用xlrd.open_workbook()打開Excel並在python中生成一個workbook對象; ② 用workbook.sheet_by_index()或者workbook.sheet_by_name()創建一個sheet對象; ③ 用sheet.row_values()或者sheet.col_values()獲取特定行或者列的數據。 ④ 用sheet.cell(x,y).value可以獲得特定單元格的數據。示例代碼如下,這裡參考了腳本之家的一篇博文。在這篇博文中還介紹了如何指定單元格的數據類型、如何輸出複雜的Excel表格,有興趣可以了解一下,這裡就不展開了。
import xlrd #載入xlrd庫nnworkbook = xlrd.open_workbook(rC:demo.xlsx) # 打開Excel文件nn# 根據sheet索引或者名稱獲取sheet內容nsheet2 = workbook.sheet_by_index(1)nsheet2 = workbook.sheet_by_name(sheet2)nn# sheet對象的基本屬性:名稱,行數,列數等:nprint(sheet2.name,sheet2.nrows,sheet2.ncols)nn# 獲取整行和整列的值(數組):nrows = sheet2.row_values(3) # 獲取第四行內容ncols = sheet2.col_values(2) # 獲取第三列內容nn# 獲取單元格內容:nprint sheet2.cell(1,0).value.encode(utf-8)nprint sheet2.cell_value(1,0).encode(utf-8)nprint sheet2.row(1)[0].value.encode(utf-8)n
用xlwt庫寫數據到Excel的基本步驟:
用xlwt庫輸出數據的方法比較簡單,主要還是用遍歷的方法將每一個數據輸入到對應的單元格,使用的函數是sheet.write(x,y,data),其中x,y指單元格的列數和行數(從0開始計數)。
輸出的過程和讀取類似,首先要創建一個工作簿對象,然後在工作簿中添加sheet對象,並向sheet中的單元格寫入數據,最後用f.save(『文件路徑』)保存。 這裡需要注意如下幾點:- xlwt一次最多保存65532行、256列,否則會報錯!這也是使用xlwt庫最大的問題,目前我還沒找到解決方法。
- 用sheet.write_merge(x1,x2,y1,y2,data)可以實現單元格的合併。
- 通過f.add_sheet()可以一次保存多個sheet到Excel中。
- 通過設置和指定保存的style(包括字體、字型大小、顏色等)可以實現Excel表格的格式化輸出。在如下的代碼中有提到set_style的方法,這裡不展開說了。
import xlwt # 載入xlwt資料庫nnf = xlwt.Workbook() # 創建工作簿nsheet1 = f.add_sheet(usheet1,cell_overwrite_ok=True) # 創建sheetnrow0 = [u業務,u狀態,u北京,u上海,u廣州,u深圳,u狀態小計,u合計]ncolumn0 = [u機票,u船票,u火車票,u汽車票,u其它]nstatus = [u預訂,u出票,u退票,u業務小計]nn# 生成第一行nfor i in range(0,len(row0)):n sheet1.write(0,i,row0[i],set_style(Times New Roman,220,True))nn# 生成第一列和最後一列(合併4行)ni, j = 1, 0nwhile i < 4*len(column0) and j < len(column0):n sheet1.write_merge(i,i+3,0,0,column0[j],set_style(Arial,220,True)) # 第一列n sheet1.write_merge(i,i+3,7,7) # 最後一列"合計"n i += 4n j += 1nnsheet1.write_merge(21,21,0,1,u合計,set_style(Times New Roman,220,True))nn# 生成第二列ni = 0nwhile i < 4*len(column0):nfor j in range(0,len(status)):n sheet1.write(j+i+1,1,status[j])n i += 4nnf.save(demo1.xlsx) # 保存文件n
(代碼參考了上述腳本之家的博客)
總的來說,通過xlrd和xlwt庫可以實現簡單數據的讀取。並且該方法可以通過指定單元格、行或者列的形式獲取特定的數據,自定義程度高。
但是,這兩個庫的問題也很明顯:致命問題在於xlwt的處理數據量有限制。而且,使用這兩個庫打開和保存Excel表格的過程複雜,無法直接讀取全部數據,還需要通過其他函數轉換成數據處理常用的DataFrame格式,比較繁瑣。
因此,如果你需要對數據進行自定義讀取和寫入,並且數據量比較小(小於),你也不怕麻煩的話,可以使用xlrd和xlwt庫來讀取數據。對於通常的數據讀取,我更推薦採用接下來要介紹的pandas的函數來讀取。2. 用pandas庫讀取和存儲數據
用pandas庫讀取數據非常的方便,一句代碼即可輕鬆實現。
pandas庫是python數據處理領域非常重要也是非常強大的一個庫,它採用一種叫「DataFrame」的結構來存儲數據(類資料庫結構)。在這種結構下,可以方便的對數據進行處理。建議下載pandas庫的官方document看,能對這個庫有一個全面的了解。這裡,我們只介紹一下簡單的用法。
Python Data Analysis Library使用pandas庫讀取數據的常用函數:
import pandas as pdntable = pd.read_table(http:somelink.csv) # 讀取任一結構型文本數據ncsv = pd.read_csv(rc:data.csv) # 讀取csv文件nexcel = pd.read_excel(rc:data.xlsx) # 讀取Excel文件n
使用 pd.read_table( ) 函數時,可以通過sep變數自定義數據的分割符,從而方便地對txt文本數據進行結構化讀取:
df = pd.read_table(path, sep = |) # 用「|」對每行數據拆分n
此外,還可以自定義表格的標題行:
user_cols = ["Name", Data_A, Data_B]ndf = pd.read_table(path, sep = |, head = None, names = user_cols)n
還可以自定義讀取表格的某些行和列:
# 讀取特定的列(按順序編號)ndf = pd.read_excel(filename, sheetname, usecols = [0,1,4,5,6,7,12,13])nn# 跳過特定行ndf = pd.read_excel(filename, sheetname, skiprows=[0]) # 跳過第一行n
對於導入的 df 數據,可以通過向屏幕列印如下參數來對數據的導入結果進行快速檢驗:
df.head() # 返回DataFrame的前幾行ndf.describe() # 返回DataFrame中數字部分的概要信息ndf.shape() # 返回DataFrame的大小(列數x行數)ndf.dtypes() # 返回DataFrame中各列的數據類型n
進 階:用pandas庫的 pd.read_sql_query 函數讀取資料庫中的數據:
import psycopg2 # 用psycopg2庫連接資料庫nimport pandas as pd # 用pd.read_sql_query在本地創建數據表nn# 定義資料庫的名稱,用戶名,密碼,鏈接地址和介面ndbname = databasenusername = "admin" npassword = "password"nhosturl = "test.redshift.amazonaws.com"nportnum = 5400nn# 連接資料庫,返回一個資料庫對象ntry:n conn = psycopg2.connect("dbname=%s port=%s user=%s host=%s password=%s" %(dbname, portnum, username, hosturl, password))nexcept:n print("Fail in connect the database!") #如果連接失敗,列印該語句到屏幕上nn# 定義查詢語句queryn# 這裡需要注意:n# 1. 查詢語句和SQLWorkbench中的幾乎一模一樣,唯一的區別是語句的最後要以英文分號結尾n# 2. 在Python中無法在字元串中直接輸入單引號,要在單引號前加上反斜杠 nquery = SELECT data, teststep FROM db.database WHERE rownumber < 100;)nn# 根據query的語句到conn資料庫中查詢,並將結果返回給data這個DataFramendf = pd.read_sql_query(query, conn) # 兩個參數:檢索語句和連接的資料庫對象n
pandas庫導出數據到Excel的方法如下:
df.to_excel(filename,sheetname) n# 將df這個DataFrame中的數據保存到excel表格中,保存路徑為filename,sheet名為sheetname(sheetname預設值為sheet1)n
如果需要在一個Excel中保存多個sheet,需要先定義一個指向Excel路徑的對象,然後向該對象中添加sheet,最後將Excel保存並關閉:
writer = pd.ExcelWriter(filename) # 定義一個向Excel寫入數據的對象ndf1.to_excel(writer,Data1) # 向該Excel中寫入df1到Data1這個sheetndf2.to_excel(writer,Data2) # 向該Excel中寫入df2到Data2這個sheetnwriter.save() # 保存Excel表格nwriter.close() # 關閉Excel表格n
在輸出數據的時候,還可以自定義輸出時列的先後順序:
# 寫入數據到sheet中,並按output_cols的順序對列進行排序noutput_cols = [Data_A, Data_B, Name]ndf.to_excel(writer,Data, columns = output_cols)n
3. 標籤型文本的處理:beautifulsoup
有時候,我們拿到的數據是標籤型數據(如HTML,XML,JSON,YAML等等)。這時候,數據的結構是通過標籤鍵值對來標記的。
這樣的數據並不適用之前的方法來讀取。我採用的方法是,使用python網路爬蟲時用到的BeatifulSoup函數來獲取標籤中的數據。通過BeautifulSoup函數可以把標籤型數據轉換為一個soup類,再對soup進行find_all(標籤名稱)並遍歷,即可讀取全部的數據了。代碼實現如下:
from bs4 import BeautifulSoup # 導入BeautifulSoup模塊。注意大小寫nimport pandas as pdnnsoup = BeautifulSoup(open(DATA.xml, rb), xml, from_encoding=utf-8) # 按照utf-8編碼制度讀取xml類型的文件nnX = []nZ = []nfor i in soup.find_all(X): # 循環遍歷所有標籤為X的數據n X.append(i.string) # 將標籤數據的string/comment寫入到X這個列表中nfor j in soup.find_all(Z):n Z.append(j.string)nn# 將列表a,b轉換成字典後,把結果轉換成DataFrame並保存到Excel中nc={"X" : X,n "Z" : Z} # 轉換為字典ndf = pd.DataFrame(c)ndf.to_excel(DATA.xlsx) n
在上述代碼中,關鍵在於第4行,如何用BeautifulSoup讀取標籤型文件。這裡詳細說明一下。在BeautifulSoup中,一般需要定義三個部分:文件信息、解析方式、編碼類型。
第一部分 open(DATA.xml, rb) 聲明了打開文件的位置和讀取方式。第二部分 xml 聲明了解析方式。常用的解析方式包括 html.parser、lxml、xml 和 html5lib。第三部分聲明了文件的編碼類型,一般來說編碼類型BeautifulSoup可以自動確定無需定義,但如果編碼類型已知,建議在此處定義好。
建立BeautifulSoup類以後,通過 soup.find_all(X) 返回全部標籤名為 X 的行的集合。從下圖中可以看出,標籤型數據包括了name,attrs,string/comment等結構,這些都已經被BeautifulSoup轉換成了類的屬性。比如,我這裡需要讀取content的內容,只需要用 i.string 即可。
4. 用os庫實現數據批量處理
os庫是一個操作系統指令庫。在數據處理過程中,用os庫可以讀取某個文件目錄下所有文件的名稱,實現對多個數據文件的批量處理:
import osnimport pandas as pdnpath0 = rC:datanfilelist = os.listdir(path0) # 讀取文件目錄下的所有文件名稱,返回一個文件列表nsheet_name = sheet1nfor excel_path in filelist: # 循環遍歷filelist中的各個文件n df = pd.read_excel(excel_path,sheet_name)n ...n
os庫可以實現對操作系統的各種命令,很多時候可以簡化我們的工作。這裡限於篇幅不展開敘述,有興趣的同學可以查看如下的鏈接:
python os模塊 常用命令總 結
本文主要介紹了如何用Python進行數據的讀取和存儲。對於通常的數據形式,推薦採用pandas庫來讀取。如果需要自定義讀取特定單元格,推薦使用xlrd庫;如果需要讀取標籤型數據,推薦使用BeautifulSoup方法。在數據讀寫過程中,合理運用os庫可以實現文件的批量導入,節省時間成本。
推薦閱讀:
※fMRI experiment Design:GLM引發的一些實驗設計要求
※在前端MVC越來越成熟Ajax大量運用的今天,傳統的MVC等數據處理完畢再顯示的方式有何優勢?
※脈衝星計時陣引力波探等6大天文開放課題將獲資助