>>>> Pandas 處理excel的英文文檔 <<<<
一、安裝環境:
1:pandas依賴處理Excel的xlrd模塊,所以我們需要提前安裝這個,安裝命令是:pip install xlrd 2:安裝pandas模塊還需要一定的編碼環境,所以我們自己在安裝的時候,確保你的電腦有這些環境:Net.4 、VC-Compiler以及winsdk_web,如果大家沒有這些軟件~可以咨詢我們的輔導員索要相關安裝工具。 3:步驟1和2 准備好了之后,我們就可以開始安裝pandas了,安裝命令是:pip install pandas 一切准備就緒,就可以開始愉快的玩耍咯! ps:在這個過程中,可能會遇到安裝不順利的情況,萬能的度娘有N種解決方案,你這么大應該要學着自己解決問題。
二、pandas操作Excel表單
數據准備,有一個Excel文件:lemon.xlsx有兩個表單,表單名分別為:Python 以及student,
Python的表單數據如下所示:
student的表單數據如下所示:
1:在利用pandas模塊進行操作前,可以先引入這個模塊,如下:
import pandas as pd
當一個excel文件的sheet比較多時候, 這時候需要獲取所有的sheet的名字. xl = pd.ExcelFile('foo.xls') xl.sheet_names # see all sheet names xl.parse(sheet_name) # read a specific sheet to DataFrame
2:讀取Excel文件的兩種方式:
#方法一:默認讀取第一個表單
df=pd.read_excel('lemon.xlsx')#這個會直接默認讀取到這個Excel的第一個表單 data=df.head()#默認讀取前5行的數據 print("獲取到所有的值:\n{0}".format(data))#格式化輸出
得到的結果是一個二維矩陣,如下所示:
#方法二:通過指定表單名的方式來讀取 df=pd.read_excel('lemon.xlsx',sheet_name='student')#可以通過sheet_name來指定讀取的表單 data=df.head()#默認讀取前5行的數據 print("獲取到所有的值:\n{0}".format(data))#格式化輸出
#方法三:通過index的方式來讀取,默認為0第一張表,一次往后加一
df=pd.read_excel('lemon.xlsx',sheet_name=1)#可以通過sheet_name來指定讀取的表單
data=df.head()#默認讀取前5行的數據
print("獲取到所有的值:\n{0}".format(data))#格式化輸出
得到的結果如下所示,也是一個二維矩陣:
#方法三:通過表單索引來指定要訪問的表單,0表示第一個表單 #也可以采用表單名和索引的雙重方式來定位表單 #也可以同時定位多個表單,方式都羅列如下所示 df=pd.read_excel('lemon.xlsx',sheet_name=['python','student'])#可以通過表單名同時指定多個 # df=pd.read_excel('lemon.xlsx',sheet_name=0)#可以通過表單索引來指定讀取的表單 # df=pd.read_excel('lemon.xlsx',sheet_name=['python',1])#可以混合的方式來指定 # df=pd.read_excel('lemon.xlsx',sheet_name=[1,2])#可以通過索引 同時指定多個 data=df.values#獲取所有的數據,注意這里不能用head()方法哦~ print("獲取到所有的值:\n{0}".format(data))#格式化輸出
具體結果是怎樣的,同學們可以自己一個一個的去嘗試,這個結果是非常有意思的,但是同時同學們也發現了,這個數據是一個二維矩陣,對於我們去做自動化測試,並不能很順利的處理,所以接下來,我們就會詳細的講解,如何來讀取行號和列號以及每一行的內容 以及制定行列的內容。
三、pandas操作Excel的行列
1:讀取指定的單行,數據會存在列表里面
#1:讀取指定行
df=pd.read_excel('lemon.xlsx')#這個會直接默認讀取到這個Excel的第一個表單
data=df.ix[0].values#0表示第一行 這里讀取數據並不包含表頭,要注意哦!
# if ix raise Exception, change ix to loc it will be work.
data=df.loc[0].values#0表示第一行 這里讀取數據並不包含表頭,要注意哦!
print("讀取指定行的數據:\n{0}".format(data))
2:讀取指定的多行,數據會存在嵌套的列表里面:
df=pd.read_excel('lemon.xlsx') data=df.ix[[1,2]].values#讀取指定多行的話,就要在ix[]里面嵌套列表指定行數 print("讀取指定行的數據:\n{0}".format(data))
3:讀取指定的行列:
df=pd.read_excel('lemon.xlsx') data=df.ix[1,2]#讀取第一行第二列的值,這里不需要嵌套列表 print("讀取指定行的數據:\n{0}".format(data))
4:讀取指定的多行多列值:
df=pd.read_excel('lemon.xlsx') data=df.ix[[1,2],['title','data']].values#讀取第一行第二行的title以及data列的值,這里需要嵌套列表 print("讀取指定行的數據:\n{0}".format(data))
5:獲取所有行的指定列
df=pd.read_excel('lemon.xlsx') data=df.ix[:,['title','data']].values#讀所有行的title以及data列的值,這里需要嵌套列表 print("讀取指定行的數據:\n{0}".format(data))
6:獲取行號並打印輸出
df=pd.read_excel('lemon.xlsx') print("輸出行號列表",df.index.values) 輸出結果是: 輸出行號列表 [0 1 2 3]
7:獲取列名並打印輸出
df=pd.read_excel('lemon.xlsx') print("輸出列標題",df.columns.values) 運行結果如下所示: 輸出列標題 ['case_id' 'title' 'data']
8:獲取指定行數的值:
df=pd.read_excel('lemon.xlsx') print("輸出值",df.sample(3).values)#這個方法類似於head()方法以及df.values方法 輸出值 [[2 '輸入錯誤的密碼' '{"mobilephone":"18688773467","pwd":"12345678"}'] [3 '正常充值' '{"mobilephone":"18688773467","amount":"1000"}'] [1 '正常登錄' '{"mobilephone":"18688773467","pwd":"123456"}']]
9:獲取指定列的值:
df=pd.read_excel('lemon.xlsx') print("輸出值\n",df['data'].values)
四:pandas處理Excel數據成為字典
我們有這樣的數據,,處理成列表嵌套字典,且字典的key為表頭名。
實現的代碼如下所示:
df=pd.read_excel('lemon.xlsx')
test_data=[]
for i in df.index.values:#獲取行號的索引,並對其進行遍歷:
# 根據i來獲取每一行指定的數據 並利用to_dict轉成字典
# col = df.columns.value
# row_data=df.ix[i,col].to_dict()
row_data=df.ix[i,['case_id','module','title','http_method','url','data','expected']].to_dict()
test_data.append(row_data)
print("最終獲取到的數據是:{0}".format(test_data))
最后得到的結果是:
最終獲取到的數據是: [{'title': '正常登錄', 'case_id': 1, 'data': '{"mobilephone":"18688773467","pwd":"123456"}'}, {'title': '輸入錯誤的密碼', 'case_id': 2, 'data': '{"mobilephone":"18688773467","pwd":"12345678"}'}, {'title': '正常充值', 'case_id': 3, 'data': '{"mobilephone":"18688773467","amount":"1000"}'}, {'title': '充值輸入負數', 'case_id': 4, 'data': '{"mobilephone":"18688773467","amount":"-100"}'}]
sheetname:默認是sheetname為0,返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe。
df = pd.read_excel(xls, sheet_name=[0], keep_default_na='') df -> (0, df) dict(df) -> {0:df}
使用pandas將數據寫入csv或xlsx
import pandas as pd result_list = [['1', 1, 1], ['2', 2, 2], ['3', 3, 3]] columns = ["URL", "predict", "score"] dt = pd.DataFrame(result_list, columns=columns) dt.to_excel("result_xlsx.xlsx", index=0) dt.to_csv("result_csv.csv", index=0)
Pandas 讀取 Excel 文件的引擎是 xlrd , xlrd 雖然同時支持 .xlsx 和 .xls 兩種文件格式,但是在源碼文件 xlrd/sheet.py 中限制了讀取的 Excel 文件行數必須小於 65536,列數必須小於 256。 源碼 >>>: if self.biff_version >= 80: self.utter_max_rows = 65536 else: self.utter_max_rows = 16384 self.utter_max_cols = 256
這就導致,即使是 .xlsx 格式的文件, xlrd 依然不支持讀取 65536 行以上的 Excel 文件(源碼中還有一個行數限制是 16384,這是因為 Excel 95 時代, xls 文件所支持的最大行數是 16384)。 解決辦法 openpyxl 是一個專門用來操作 .xlsx 格式文件的 Python 庫,和 xlrd 相比它對於最大行列數的支持和 .xlsx 文件所定義的最大行列數一致。 首先安裝 openpyxl : pip install openpyxl Pandas 的 read_excel 方法中,有 engine 字段,可以指定所使用的處理 Excel 文件的引擎,填入 openpyxl ,再讀取文件就可以了。 import os import pandas as pd # 將文件讀取出來放一個列表里面 pwd = '1' # 獲取文件目錄 # 新建列表,存放文件名 file_list = [] # 新建列表存放每個文件數據(依次讀取多個相同結構的Excel文件並創建DataFrame) dfs = [] for root,dirs,files in os.walk(pwd): # 第一個為起始路徑,第二個為起始路徑下的文件夾,第三個是起始路徑下的文件。 for file in files: file_path = os.path.join(root, file) file_list.append(file_path) # 使用os.path.join(dirpath, name)得到全路徑 df = pd.read_excel(file_path) # 導入xlsx文件,將excel轉換成DataFrame dfs.append(df) # 將多個DataFrame合並為一個 df = pd.concat(dfs) # 數據輸出,寫入excel文件,不包含索引數據 # 數據寫入 Excel,需要首先安裝一個 engine,由 engine 負責將數據寫入 Excel,pandas 使用 openpyx 或 xlsxwriter 作為寫入引擎。 df.to_excel('test\\1.xlsx', index=False,engine='openpyxl') # 導出 Excel,一般不需要索引,將index設置為False, 如果沒有包直接pip3 install openpyxl
openpyxl.utils.exceptions.IllegalCharacterError
在使用pandas寫excel的時候,可能會出現openpyxl.utils.exceptions.IllegalCharacterError的提示錯誤 。根據提示可以知道是openpyxl模塊中的錯誤。因此需要到相應的代碼查看原因,進入python命令行模式,輸入如下: >>> import sys >>> help('openpyxl') 可得openpyxl模塊的路徑如下/usr/local/lib/python2.7/site-packages/openpyxl,查看該目錄下的cell子目錄中的cell.py文件,定位到具體錯誤代碼為: def check_string(self, value): """Check string coding, length, and line break character""" if value is None: return # convert to unicode string if not isinstance(value, unicode): value = unicode(value, self.encoding) value = unicode(value) # string must never be longer than 32,767 characters # truncate if necessary value = value[:32767] if next(ILLEGAL_CHARACTERS_RE.finditer(value), None): raise IllegalCharacterError return value 其中ILLEGAL_CHARACTERS_RE的定義在文件的開頭,如下: ILLEGAL_CHARACTERS_RE = re.compile(r'[\000-\010]|[\013-\014]|[\016-\037]') 這里面的非法字符都是八進制,可以到對應的ASCII表中查看,的確都是不常見的不可顯示字符,例如退格,響鈴等,在此處被定義為excel中的非法字符。 解決上述錯誤有兩種方法,如下: 1,既然檢測到excel中存在[\000-\010]|[\013-\014]|[\016-\037]這些非法的字符,因此可以將字符串中的非法字符替換掉即可,在重新寫入excel即可。如下: text= ILLEGAL_CHARACTERS_RE.sub(r'', text) 2,使用xlsxwriter import xlsxwriter outputData.to_excel(outputExcelFilePath, engine='xlsxwriter') # outputData是一個DataFrame,在 xlsxwriter應該也是替換掉非法字符,省去了我們手工操作。