python csv讀取到字典_用Python快速的處理表格,讓你快人一步兩步三四步!
技術標籤:python csv讀取到字典python xlsx 讀寫python 寫csvpython 讀csv第一個sheetnamepython怎麼把字典寫到csv表格python讀取csv設計數字大屏
日常工作中表格處理時非常令人頭疼的一個部分,今天我們來分享一下如何用Python快速的處理表格讀寫,處理資料,提高我們的效率。
比如我們邊讀表格邊按複雜規則篩選我們的資料、統計我們的資料;或者我們邊解析文字邊把結果寫到表格,形式報告。
上一節我們最後寫了一個解析文字(裝置上show出來的配置)成字典的列表的指令碼,可以和這個相呼應。
我們已經拿到了結構化資料,我們把它寫到一個Excel表格裡,今天繼續用Python實現。
今天的內容主要是分享
1、基於Python內建的CSV的幾種讀寫(可以不看)
2、基於xlrd的讀方式(初學者完全可以不看)
3、基於Pandas的表格讀寫計算(必看,最簡方式,沒時間直接看這個吧!)
大家各取所需去讀對應的即可。
基於Python內建的CSV表格處理
CSV
我們先從簡單的CSV處理,不需要裝任務第三方包即可解析處理,如果各位是Excel,也可以另存為csv格式的。
概念
CSV (Comma Separated Values),即逗號分隔值(也稱字元分隔值,因為分隔符可以不是逗號),是一種常用的文字 格式,用以儲存表格資料,包括數字或者字元。很多程式在處理資料時都會碰到csv這種格式的檔案,它的使用是比 較廣泛的(Kaggle上一些題目提供的資料就是csv格式),csv雖然使用廣泛,但卻沒有通用的標準,所以在處理csv 格式時常常會碰到麻煩,幸好python內建了csv模組。下面簡單介紹csv模組中最常用的一些函式。
讀表格
我們用到了一個特殊的資料結構 nametuple可以兼顧字典和物件的一些優點。
import csvfrom collections import namedtuplewith open('accessinfo_base.csv',encoding='utf8') as f: f_csv = csv.reader(f) headers = next(f_csv) print('表頭',headers) for row in f_csv: print(row)## named tuplewith open('accessinfo_base.csv',encoding='utf8') as f: f_csv = csv.reader(f) headers = next(f_csv) Row = namedtuple('Row',headers) for r in f_csv: row = Row(*r) print(row,row.role,row.area)## 讀取到字典去中with open('accessinfo_base.csv',encoding='utf8') as f: f_csv = csv.DictReader(f) for r in f_csv: print(r)
寫表格
## 讀取到字典去中with open('accessinfo_base.csv',encoding='utf8') as f: f_csv = csv.DictReader(f) for r in f_csv: print(r)## 寫入csv,先建立一個csv的writer物件with open('test1.csv', 'w', encoding='utf8') as f: headers = ['ip', 'area', 'role'] rows = [['127.0.0.1', 'A', 'AS'], ['127.0.0.1', 'A', 'AS'], ['127.0.0.1', 'A', 'AS'], ['127.0.0.1', 'A', 'AS']] csv_writer = csv.writer(f) csv_writer.writerow(headers) csv_writer.writerows(rows)# newline很重要,不然會出現間隔的空白行,w代表寫檔案。with open('test2.csv', 'w', encoding='utf8',newline='') as f: headers = ['ip', 'area', 'role'] rows = [['127.0.0.1', 'A', 'AS'], ['127.0.0.1', 'A', 'AS'], ['127.0.0.1', 'A', 'AS'], ['127.0.0.1', 'A', 'AS']] csv_writer = csv.writer(f,delimiter='\t') csv_writer.writerow(headers) csv_writer.writerows(rows)## 字典的方式寫入with open('test3.csv', 'w', encoding='utf8',newline='') as f: headers = ['ip', 'area', 'role'] rows = [{ 'ip': '12', 'area': 'a', 'role': 'as' }, { 'ip': '12', 'area': 'a', 'role': 'as' }, { 'ip': '12', 'area': 'a', 'role': 'as' }, ] csv_writer = csv.DictWriter(f,headers) csv_writer.writeheader() csv_writer.writerows(rows)
基於xlrd的讀方式
xlrd
如果是anaconda,無需安裝,後者cmd執行 pip install xlrd
讀Excel檔案
支援xls、xlsx
import xlrddef print_excel(filePath): myWbook = xlrd.open_workbook(filePath) mySheet = myWbook.sheet_by_index(0) # 也可以使用函式mySheet = myWbook.sheet_by_name('sheet1') nrows = mySheet.nrows # 行數 ncols = mySheet.ncols # 列數 i = 1 err_num=0 while i < nrows: try: print(mySheet.row_values(i)) a = mySheet.row(i)[0].value b = mySheet.row(i)[1].value c = mySheet.row(i)[2].value print(a,b,c) i = i + 1 except Exception as e: print(e) err_num = err_num + 1 i = i + 1 return err_num # success def print_excel_2(filePath): myWbook = xlrd.open_workbook(filePath) mySheet = myWbook.sheet_by_index(0) # 也可以使用函式mySheet = myWbook.sheet_by_name('sheet1') cell_type = mySheet.cell(1,2).ctype ## 1為字串、2為數字 3為日期 print(cell_type) #取某個位置的值 print(mySheet.cell(1,1).value) print(mySheet._cell_values) ##讀取整個cell if __name__ == '__main__': print_excel_2('accessinfo_base.xls')
基於Pandas的表格讀寫計算
pandas
如果是anaconda,無需安裝,未安裝,cmd執行 pip install pandas安裝Python的這個優秀的第三方包。
pandas是一款資料處理的工具,基於Numpy去編寫的。提供了大量快捷處理資料的函式和方法。
本次我使用它在讀寫表格的一些便捷的方法,其實有點大材小用。
讀表格
實用主義者可以直接去看“以轉換dict的list的方式讀取”
首先可以先建立一個excel檔案當作實驗資料,名稱為example.xlsx,內容如下:
name | age | gender |
---|---|---|
John | 30 | male |
Mary | 22 | female |
Smith | 32 | male |
讀取並列印
注意 sheet名要對應起來。
# coding:utf-8import pandas as pddata = pd.read_excel('example.xlsx', sheet_name='Sheet1')print(data)
這裡使用了read_excel()方法來讀取excel,來看一個read_excel()這個方法的API,這裡只截選一部分經常使用的引數:
pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None)
這裡主要引數為io,sheet_name,header,usecols和names
io:excel檔案路徑
sheet_name:返回指定的sheet,如果將sheet_name指定為None,則返回第一頁,如果需要返回多個表,可以將sheet_name指定為一個列表,例如['sheet1', 'sheet2']
header:指定資料表的表頭,預設值為0,即將第一行作為表頭。如果表中無表頭,此值應為None,對應的表頭會用索引表示,也可搭配names,指定表頭。
usecols:讀取指定的列,例如想要讀取第一列和第二列資料:
pd.read_excel("example.xlsx", sheet_name=None, usecols=[0, 1])
index_col 指定某列為索引
遍歷所有行
# coding:utf-8import pandas as pddata = pd.read_excel('example.xlsx', )print(data)for index, row in data.iterrows(): print(row['name'], row['age'], row['gender']) print(row[0], row[1], row[2])
以轉換dict的list的方式讀取
# coding:utf-8import pandas as pddata = pd.read_excel('example.xlsx', )data = data.to_dict(orient='records')print(data)
寫表格
DataFrame(data).to_excel('example.xlsx', sheet_name='Sheet1', index=False, header=True)
# coding:utf-8import pandas as pdraw_data = [{'name': 'John', 'age': 30, 'gender': 'male'}, {'name': 'Mary', 'age': 22, 'gender': 'female'}, {'name': 'Smith', 'age': 32, 'gender': 'male'}]data = pd.DataFrame(raw_data)print(data)data.to_excel('example_output.xlsx', sheet_name='Test01', index=False, header=True)
資料的計算
我們只寫資料計算部分,不去寫讀取和寫入的部分。
有時候我們需要處理表格中的內容,比如根據表格中的多項欄位生成一個新的欄位,得到一個新的結論。
比如有時候考試題出的太難了,大家都不及格,我們想讓大家都及格,可以這樣寫。我們沒有采用乘以10開根號的辦法,我們簡單點。
import pandas as pdraw_data = [{'name': 'John', 'score': 30, 'gender': 'male'}, {'name': 'Mary', 'score': 22, 'gender': 'female'}, {'name': 'Smith', 'score': 32, 'gender': 'male'}]data = pd.DataFrame(raw_data)print(data)def jige(row): print(row) if row['score'] < 60: return 60 return row['score']data['new_score'] = data.apply(jige, axis=1)print(data)
這個程式碼的讀取和寫入我們省略了,大家可以自己補充上。
通過在資料裡呼叫我們的函式,我們成功讓大家都及格了。
我們想像下運維中的場景,比如根據埠型別、描述得出某些結論即一個新的欄位。
計算此埠上是否有crc err數,甚至可以根據以往記錄去計算crc的增長。
判斷某些指標是否超過閾值,得出一個個的結論,即很多欄位,加之組合生成一個巡檢報告。
真的是拋磚。
還是希望分享一些方法,大家學會點基礎的後,自己開腦洞!
好了關於Python的入門、讀寫檔案、表格操作我們就講完了!歡迎大家關注公眾號,後續的分享會緊貼網路運維。
後續我們會聚焦網路運維,講解一些能夠提高我們運維效率的工具、技術、程式碼等等,講解一些在雲端計算時代所需要了解的開源元件。
大家有什麼想了解的也可以私信我,我會分享我所瞭解的部分~