1. 程式人生 > 其它 >python csv讀取到字典_用Python快速的處理表格,讓你快人一步兩步三四步!

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,內容如下:

nameagegender
John30male
Mary22female
Smith32male

讀取並列印

注意 sheet名要對應起來。

# coding:utf-8import pandas as pddata = pd.read_excel('example.xlsx', sheet_name='Sheet1')print(data)

b171bfa2773903fd467810af2052c6cd.png

這裡使用了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])

55b70dea7eb23f9b5c7b2587036bc1dd.png

以轉換dict的list的方式讀取

# coding:utf-8import pandas as pddata = pd.read_excel('example.xlsx', )data = data.to_dict(orient='records')print(data)

ff26a611ce0119ffb581b25f0f25005f.png

寫表格

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)

3ed63e4e9e09d42fa5396cb9610afa52.png

資料的計算

我們只寫資料計算部分,不去寫讀取和寫入的部分。

有時候我們需要處理表格中的內容,比如根據表格中的多項欄位生成一個新的欄位,得到一個新的結論。

比如有時候考試題出的太難了,大家都不及格,我們想讓大家都及格,可以這樣寫。我們沒有采用乘以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的入門、讀寫檔案、表格操作我們就講完了!歡迎大家關注公眾號,後續的分享會緊貼網路運維。

後續我們會聚焦網路運維,講解一些能夠提高我們運維效率的工具、技術、程式碼等等,講解一些在雲端計算時代所需要了解的開源元件。

大家有什麼想了解的也可以私信我,我會分享我所瞭解的部分~