成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我修復(fù)了Pandas包的一個bug

開發(fā) 后端
這篇文章介紹Pandas中一個bug,昨天研究了此bug出現(xiàn)的原因,及修改措施。感興趣的可以看一下,或許在日后能對你有一些幫助。

你好,我是zhenguo,今天說個開心事~  

1. 還原這個bug

導(dǎo)出含有層級關(guān)系的列頭時,會多寫出一個空行,此bug穩(wěn)定出現(xiàn)。

2. 定位問題

經(jīng)過調(diào)試發(fā)現(xiàn),鎖定此bug出現(xiàn)的位置到excel.py模塊,如下所示:

理一理excel.py模塊封裝的方法,經(jīng)過調(diào)試發(fā)現(xiàn),write方法中下面幾行代碼是關(guān)鍵邏輯:

寫入到excel過程,實際是逐個單元格寫入到excel過程,主要調(diào)用封裝的get_formatted_cells方法得到formatted_cells。

formatted_cells = self.get_formatted_cells()
writer.write_cells(
formatted_cells,
sheet_name,
startrow=startrow,
startcol=startcol,
freeze_panes=freeze_panes,
)

再進去看看get_formatted_cells方法,它使用chain串接了兩個生成器,然后逐一yield吐出cell:

def get_formatted_cells(self):
for cell in itertools.chain(self._format_header(), self._format_body()):
cell.val = self._format_value(cell.val)
yield cell

而串接的這兩個迭代器,一個是self._format_header(),另一個是self._format_body()。

經(jīng)過調(diào)試,在這里就能找到bug出現(xiàn)的原因,self._format_body()是有問題的,經(jīng)過格式化數(shù)據(jù)域部分。拿文章一開始的case舉例,取值為a的單元格對應(yīng)的行索引被錯誤的標(biāo)記為3,注意行索引是從0開始的。很明顯,實際應(yīng)該是2。

3. 修復(fù)bug

找到原因后,進一步下鉆到底層方法,經(jīng)過調(diào)試,進一步鎖定到self._format_body()中調(diào)用的 _format_regular_rows方法,里面與行編號相關(guān)聯(lián)的屬性是self.rowcounter,所以重點關(guān)注與它相關(guān)的寫入邏輯:

def _format_regular_rows(self):
has_aliases = isinstance(self.header, (tuple, list, np.ndarray, Index))
if has_aliases or self.header:
self.rowcounter += 1
# output index and index_label?
if self.index:
# check aliases
# if list only take first as this is not a MultiIndex
if self.index_label and isinstance(
self.index_label, (list, tuple, np.ndarray, Index)
):
index_label = self.index_label[0]
# if string good to go
elif self.index_label and isinstance(self.index_label, str):
index_label = self.index_label
else:
index_label = self.df.index.names[0]
if isinstance(self.columns, ABCMultiIndex):
self.rowcounter += 1

一共有2處可能的寫入,其中第二處寫入,也就是上面代碼塊的最后兩行,是bug出現(xiàn)的原因。經(jīng)過仔細(xì)分析,在級聯(lián)表頭(ABCMultiIndex)寫入excel場景中,行索引已經(jīng)在self._format_header()中,行索引已經(jīng)被加1,所以再在此處對其加1,是重復(fù)的:

if isinstance(self.columns, ABCMultiIndex):
self.rowcounter += 1

所以修改方法就是對其標(biāo)注即可。

4. 修復(fù)bug后

修復(fù)后,經(jīng)過測試級聯(lián)列頭、單列頭,都正常,不再有多余的空行。

以上,此bug我已經(jīng)提交到github的pandas中,希望幫助到更多的開發(fā)者。

我是zhenguo,最后希望點贊+轉(zhuǎn)發(fā)~

責(zé)任編輯:龐桂玉 來源: Python小例子
相關(guān)推薦

2021-09-13 08:41:52

職場互聯(lián)網(wǎng)自閉

2014-12-17 09:40:22

dockerLinuxPaaS

2016-09-28 14:00:56

2022-06-08 08:14:27

Dubbo數(shù)據(jù)包源代碼

2022-11-30 09:18:51

JavaMyBatisMQ

2021-04-22 07:47:47

JavaJDKMYSQL

2023-05-09 11:02:22

Go內(nèi)聯(lián)版本

2022-07-22 15:40:26

Atlassian服務(wù)器漏洞

2024-10-25 12:38:27

2022-04-06 08:47:03

Dubbo服務(wù)協(xié)議

2014-11-14 09:36:58

微軟bug

2022-11-18 14:15:13

2016-12-14 10:00:44

數(shù)據(jù)結(jié)構(gòu)編譯器

2020-01-10 09:20:03

手機ISOJDK

2022-05-27 07:03:04

JDK場景線程

2020-11-04 07:56:19

工具Linux 翻譯

2021-04-30 07:09:48

SQLP0事故

2025-02-13 07:00:00

Dubbo-goJava服務(wù)端

2020-09-27 14:13:50

Spring BootJava框架

2009-09-14 17:08:02

WebFormView
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91麻豆精品国产91久久久更新资源速度超快 | 成人在线小视频 | 精品一区二区在线视频 | 欧美成人a | 亚洲欧美日韩在线 | 在线观看中文字幕视频 | 亚洲情综合五月天 | 久久tv在线观看 | 日本aa毛片a级毛片免费观看 | 久久久久久九九九九 | 亚洲自拍一区在线观看 | 精品一区二区三 | 亚洲国产成人av好男人在线观看 | 久久国产三级 | 粉嫩一区二区三区四区公司1 | 日本视频一区二区 | 午夜免费视频 | 在线免费激情视频 | 欧美性网 | 成人久久视频 | 日本 欧美 国产 | 国产精品一区二区无线 | 国产成人免费视频网站高清观看视频 | a级大片 | 97超碰在线播放 | 91精品国产综合久久小仙女图片 | 亚洲婷婷一区 | 九色.com | 成人免费一区二区 | 99久久精品免费 | 亚洲福利一区 | 麻豆久久久久久久 | 国产不卡在线播放 | 欧美性极品xxxx做受 | 天天天天操 | 国产欧美一区二区精品忘忧草 | 欧美日韩国产一区二区三区 | 色综合天天天天做夜夜夜夜做 | 成人精品国产免费网站 | 91免费小视频 | 久久久久久久一区 |