那麼我們希望讀出來的資料是這個什麼樣子呢?也就是資料結構是怎麼樣的?
既然excel是個二維**,那麼讀出來的數也放在乙個二維**裡面得了。
我們乙個簡化版的例子來看,下面的**是從原始**中截出來的一部分。
產品編碼
產品型號
數量標準價(rmb)
0235a0w2
rt-msr5660
250000
這樣的缺點在於:取每個元素,需要計算index,不方便程式設計。
比如我們要取第三行的「rt-msr5660」,我們需要使用a[1][1]
來取,非常不方便。
我們知道最方便取的資料結構為dict,只要傳進去乙個key,它就會返回乙個value,這樣的好處是
那麼具體的資料格式應該是怎麼樣的呢?
首先我們為所能用到的列分配乙個key值,對映**如下:
nhct中的列
key值
idid
產品編碼
bom產品型號
typeid
專案名稱
description
單套數量
quantity
目錄價unitsnetlistprice
折扣discount
單價unitsnetprice
總價totalprice
總目錄價
totallistprice
產線pl
watson_line_item_id
waston
備註remarks
那麼下面**所對應的資料結構可以設計成這個樣子。
產品編碼
產品型號
數量標準價(rmb)
0235a0w2
rt-msr5660
250000
[
,]
我們來看一下特點:
既然現在資料結構已經設計好了,我們就來看如何讀資料,並形成這樣的資料結構吧。
首先引入模組
import xlrd
然後定義乙個操作類,從excel中讀取資料並轉換的函式為getassociativearray
,需要把excel的完整路徑傳遞進去,以及要讀取的sheet的名稱,還有就是為每列取的key值
class xlrdtool(xlsreader):
# 作用:獲取關聯陣列
# inputheaderkey:陣列每一列的對應的鍵值
# 返回:乙個陣列,陣列的每一行為乙個dict,代表原來**裡面的每一行,其中此dict的鍵名為輸入的inputheaderkey,鍵值為讀入的excel檔案的對應值。
def getassociativearray (self, excelpathname, sheetname , inputheaderkey):
list =
try:
sheetlist = xlrd.open_workbook(excelpathname).sheet_by_name(sheetname);
# row:表示從當前sheet讀出了的每一行,
# 將每一行的row_values與inputheaderkey組成dict
list = [dict (zip (inputheaderkey , sheetlist
.row_values(row))) for row in range(sheetlist.nrows)];
except exception as data:
print("開啟檔案失敗,%s" % data);
return list;
裡面最關鍵的**其實只有:
list =
sheetlist = xlrd.open_workbook(excelpathname).sheet_by_name(sheetname);
list = [dict (zip (inputheaderkey , sheetlist
.row_values(row))) for row in range(sheetlist.nrows)];
我們來一一看看。
對其中某一行row
總結一下就是,把為每列分配的key值陣列與每一行進行zip,然後轉換為dict,最後把所有的dict組成乙個list。
上面講了如何從excel讀取資料形成陣列。
我們再來看一下這種資料結構
a = [
,]
它是乙個巢狀的資料結構,總體上是乙個list,它有兩個元素,每個元素都是乙個dict
那麼這個地方就有個坑點了
如果我們再把這個list賦給b,然後在b中把price的**修改了。
那麼list最開始指向的dict並沒有變,沒有指向另乙個元素,所以list沒有改變,
但是dict發生改變了。
也就是a對應的那個price也發生了改變了。
所以我們需要注意,如果把list賦給另乙個變數以後,一定要深複製乙份。
對於我們這個專案來說,遍歷可能是最重要的演算法了。首先我們來看一下我們官方給出來的**吧。
一套配置清單其實有若干套裝置構成,每套裝置又有乙個子標題以及相應的詳細配置資訊等,還有小計等。
多套裝置組成了整個清單,
在講遍歷前,我們需要對每個區域取個名字。
我們可以把所有行分為如下幾類:
這幾種他們對應的顏色也可以設為不同的,所以統稱為colortag
那麼怎麼在程式中區分不同的行的型別呢?
我們知道之前設計的資料結構本質就是乙個list,而每一行是乙個dict,所以只需要再加乙個鍵值對即可,比如總計行就加上"colortag":"total"
即可。
之前讀取excel資料的時候並沒有加上這個colortag,那麼現在要加的話,需要對整個list進行一次遍歷,識別每一行的特徵,加上相應的colortag
adiff = [i for i in ['bom','typeid','description'] if i in self.lists[0].keys()];
coltag = adiff[0];
for alist in self.lists:
if alist[coltag] == "小計":
alist['colortag'] = "subtotal";
elif alist[coltag] == "總計":
alist['colortag'] = "total";
elif alist['id'] != "":
alist['colortag'] = 'site';
else:
alist['colortag'] = "general";
self.lists[0]['colortag'] = "header"
解釋一下**:
我們還可以再遍歷一次新生成的list,然後把colortag為site的那些行的序號取出來,這就可以確定每一套裝置的起始和截止的位置了。
核心主要常數
1 系統最大程序數 系統最大程序 任務 數為64。2 程序的執行狀態 define task running 0 程序正在執行或已準備就緒。define task interruptible 1 程序處於可中斷等待狀態。define task uninterruptible 2 程序處於不可中斷等待...
css div主要標籤
color 999999 文字顏色 font family 宋體 文字字型 font size 10pt 文字大小 font style itelic 文字斜體育 font variant small caps 小字型 letter spacing 1pt 文字間距 line height 200 ...
NHibernate主要介面
一 介面簡介 isession isession是面向使用者的主要介面,主要用於物件持久化,資料載入等操作,支援資料庫事務,它隱藏了nhb內部複雜的實現細節,isession由isessionfactory建立。isessionfactory isessionfactory是nhb內部的核心類,它維...