婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > pandas讀取excel時獲取讀取進度的實現

pandas讀取excel時獲取讀取進度的實現

熱門標簽:佛山通用400電話申請 廣東旅游地圖標注 京華圖書館地圖標注 淮安呼叫中心外呼系統如何 打印谷歌地圖標注 電話機器人貸款詐騙 蘇州人工外呼系統軟件 電話外呼系統招商代理 看懂地圖標注方法

寫在前面

QQ群里偶然看到群友問這個問題, pandas讀取大文件時怎么才能獲取進度? 我第一反應是: 除非pandas的read_excel等函數提供了回調函數的接口, 否則應該沒辦法做到. 搜索了一下官方文檔和網上的帖子, 果然是沒有現成的方案, 只能自己動手.

準備工作

確定方案

一開始我就確認了實現方案, 那就是增加回調函數. 這里現學現賣科普一下什么是回調函數. 簡單的說就是:

所使用的模塊里面, 會調用一個你給定的外部方法/函數, 就是回調函數. 拿本次的嘗試作為例子, 我會編寫一個"顯示進度函數", 通過傳參的方式傳入pd.read_excel, 這樣pd在讀取excel時, 會邊讀取邊調用"顯示進度函數". 為什么不直接在pd里面增加? 因為pd讀取excel文件時是阻塞的, 內部方法在被調用時無法拋出進度信息. (如有謬誤請指正)

理解讀取方式

先得了解一下pandas是怎么讀取excel的. 在pycharm里面按住control點擊read_excel, 再瀏覽一下代碼根據關鍵的函數繼續跳轉, 還是挺容易得到調用的路徑的.

最后OpenpyxlReader讀取excel的方法代碼如下. 很明顯重點就在其中的for循環里. 調用get_sheet_data時, 已經通過一系列方法獲得了目標sheet(這里細節不贅述), 然后在for循環里逐行讀取數據并返回data最后生成dataframe.

def get_sheet_data(self, sheet, convert_float: bool) -> List[List[Scalar]]:
        # GH 39001
        # Reading of excel file depends on dimension data being correct but
        # writers sometimes omit or get it wrong
        import openpyxl

        version = LooseVersion(get_version(openpyxl))

        # There is no good way of determining if a sheet is read-only
        # https://foss.heptapod.net/openpyxl/openpyxl/-/issues/1605
        is_readonly = hasattr(sheet, "reset_dimensions")

        if version >= "3.0.0" and is_readonly:
            sheet.reset_dimensions()

        data: List[List[Scalar]] = []
        last_row_with_data = -1
        for row_number, row in enumerate(sheet.rows):
            converted_row = [self._convert_cell(cell, convert_float) for cell in row]
            if not all(cell == "" for cell in converted_row):
                last_row_with_data = row_number
            data.append(converted_row)

        # Trim trailing empty rows
        data = data[: last_row_with_data + 1]

        if version >= "3.0.0" and is_readonly and len(data) > 0:
            # With dimension reset, openpyxl no longer pads rows
            max_width = max(len(data_row) for data_row in data)
            if min(len(data_row) for data_row in data)  max_width:
                empty_cell: List[Scalar] = [""]
                data = [
                    data_row + (max_width - len(data_row)) * empty_cell
                    for data_row in data
                ]

        return data

開始改動

這里直接暴力更改pandas庫源文件!(僅用于調試, 注意備份和保護自己的工作環境)

主程序代碼

編寫main.py, 代碼比較簡單, 相關功能我都用注釋作為解釋. 其中show_pd_read_excel_progress就是我編寫的回調函數, 通過命令行的方式輸出實時的讀取進度. 當然你如果編寫的是GUI程序比如PYQT5, 也可以在這個回調函數中發送signal給main UI, 做成progress bar或者其他的GUI樣式.

import pandas as pd
from datetime import datetime

'''
定義回調函數
cur: 讀取時的當前行數
tt: 讀取文件的總行數
'''
def show_pd_read_excel_progress(cur, tt):
    # 進度數值
    progress = " {:.2f}%".format(cur/tt*100)
    # 進度條
    bar = " ".join("█" for _ in range(int(cur/tt*100/10)))
    # 顯示進度
    print("\r進度:" + bar + progress, end="", flush=True)

# 記錄開始時間
t = datetime.now()
# 開始讀取excel
print("pd.read_excel: test_4.xlsx...")
xl_data = pd.read_excel("test_4.xlsx", callback=show_pd_read_excel_progress)
# 打印excel頭幾行
print(xl_data.head())
print("\n")
# 顯示花費的時間
print("Time spent:", datetime.now()-t)

修改pandas源碼

再自己觀察一下, 我在pd.read_excel方法的參數里增加了callback參數, 這個參數是原版read_excel方法里沒有的. 所以我們需要處理pandas源碼, 這個源碼在…/pandas/io/excel/_base.py中, pycharm中按住control點擊read_excel可以快速跳轉. 這個地方我增加了一個參數callback, 默認值為None. 下方io.parse同樣把callback參數傳遞給ExcelFile類.

def read_excel(
    io,
    sheet_name=0,
    header=0,
    names=None,
    index_col=None,
    usecols=None,
    squeeze=False,
    dtype=None,
    engine=None,
    converters=None,
    true_values=None,
    false_values=None,
    skiprows=None,
    nrows=None,
    na_values=None,
    keep_default_na=True,
    na_filter=True,
    verbose=False,
    parse_dates=False,
    date_parser=None,
    thousands=None,
    comment=None,
    skipfooter=0,
    convert_float=True,
    mangle_dupe_cols=True,
    storage_options: StorageOptions = None,
    callback = None, # 增加callback參數
):

    should_close = False
    if not isinstance(io, ExcelFile):
        should_close = True
        io = ExcelFile(io, storage_options=storage_options, engine=engine)
    elif engine and engine != io.engine:
        raise ValueError(
            "Engine should not be specified when passing "
            "an ExcelFile - ExcelFile already has the engine set"
        )

    try:
        data = io.parse(
            sheet_name=sheet_name,
            header=header,
            names=names,
            index_col=index_col,
            usecols=usecols,
            squeeze=squeeze,
            dtype=dtype,
            converters=converters,
            true_values=true_values,
            false_values=false_values,
            skiprows=skiprows,
            nrows=nrows,
            na_values=na_values,
            keep_default_na=keep_default_na,
            na_filter=na_filter,
            verbose=verbose,
            parse_dates=parse_dates,
            date_parser=date_parser,
            thousands=thousands,
            comment=comment,
            skipfooter=skipfooter,
            convert_float=convert_float,
            mangle_dupe_cols=mangle_dupe_cols,
            callback = callback, # 增加callback參數
        )
    finally:
        # make sure to close opened file handles
        if should_close:
            io.close()
    return data
... # 省略代碼

瀏覽一下ExcelFile類(還在_base.py中)的代碼, 這個類會根據文件類型選擇引擎, 我讀取的是xlsx文件, 所以會跳轉到openpyxl并把所有的參數傳遞過去, 這個類不用處理. 下面跳轉到_openpyxl.py中看一下OpenpyxlReader類, 這個類是繼承BaseExcelReader類(在_base.py中)的, 所以還是得回去看一下BaseExcelReader, 并修改一下參數, 增加callback(如下2處).

def parse(
        self,
        sheet_name=0,
        header=0,
        names=None,
        index_col=None,
        usecols=None,
        squeeze=False,
        dtype=None,
        true_values=None,
        false_values=None,
        skiprows=None,
        nrows=None,
        na_values=None,
        verbose=False,
        parse_dates=False,
        date_parser=None,
        thousands=None,
        comment=None,
        skipfooter=0,
        convert_float=True,
        mangle_dupe_cols=True,
        callback = None, # 增加callback參數
        **kwds,
    ):
... # 省略代碼
for asheetname in sheets:
            if verbose:
                print(f"Reading sheet {asheetname}")

            if isinstance(asheetname, str):
                sheet = self.get_sheet_by_name(asheetname)
            else:  # assume an integer if not a string
                sheet = self.get_sheet_by_index(asheetname)

            data = self.get_sheet_data(sheet, convert_float, callback) # 傳遞callback參數給get_sheet_data方法
            usecols = maybe_convert_usecols(usecols)
... # 省略代碼

好了, 終于到重點了, 我們跳轉到get_sheet_data方法, 并做對應修改(方法參數, 獲取總行數, 調用回調函數). 思路非常清晰, 通過一頓操作, 終于千里迢迢把callback給一層層傳遞過來了, 所以在一行行讀取excel時, 可以調用并顯示進度了.

def get_sheet_data(self, sheet, convert_float: bool, callback) -> List[List[Scalar]]: # 傳遞參數增加callback
        # GH 39001
        # Reading of excel file depends on dimension data being correct but
        # writers sometimes omit or get it wrong
        import openpyxl
				# 獲取sheet的總行數
        max_row = sheet.max_row
        print("sheet_max_row:", sheet.max_row)

        version = LooseVersion(get_version(openpyxl))

        # There is no good way of determining if a sheet is read-only
        # https://foss.heptapod.net/openpyxl/openpyxl/-/issues/1605
        is_readonly = hasattr(sheet, "reset_dimensions")

        if version >= "3.0.0" and is_readonly:
            sheet.reset_dimensions()

        data: List[List[Scalar]] = []
        last_row_with_data = -1
        for row_number, row in enumerate(sheet.rows):
						# 調用回調函數
            if callback is not None:
                callback(row_number+1, max_row)
            converted_row = [self._convert_cell(cell, convert_float) for cell in row]
            if not all(cell == "" for cell in converted_row):
                last_row_with_data = row_number
            data.append(converted_row)

        # Trim trailing empty rows
        data = data[: last_row_with_data + 1]

        if version >= "3.0.0" and is_readonly and len(data) > 0:
            # With dimension reset, openpyxl no longer pads rows
            max_width = max(len(data_row) for data_row in data)
            if min(len(data_row) for data_row in data)  max_width:
                empty_cell: List[Scalar] = [""]
                data = [
                    data_row + (max_width - len(data_row)) * empty_cell
                    for data_row in data
                ]

        return data

運行測試

運行一下main.py, 效果如下, 實時顯示進度功能已經實現, 且會計算出讀取所花費的時間. 如果你是要讀取csv或者sql之類的, 也可以照貓畫虎.

優化和應用

  • 前面也說過直接修改pandas源碼是非常不科學的操作, 這會破壞已有的編程環境, 且源碼換到別的機器上還得重新在修改一遍
  • 也嘗試過用繼承+重寫pandas, 不過水平有限沒有成功, 希望大家指點
  • 實測print進度條會非常費時間, 當然也不需要每讀一行excel都更新一次進度條, 定時(比如每秒刷一次)或者定量(每n行, 或者每1%進度刷新一次)比較合理
  • 讀取大規模數據時, 頻繁調用回調函數肯定會耽誤效率, 不過如果是GUI程序或者給其他人使用的, 有實時進度肯定會改善用戶體驗, 其中優劣需要coder自己權衡

到此這篇關于pandas讀取excel時獲取讀取進度的實現的文章就介紹到這了,更多相關pandas讀取excel讀取內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 教你使用Pandas直接核算Excel中的快遞費用
  • Python入門之使用pandas分析excel數據
  • pandas快速處理Excel,替換Nan,轉字典的操作
  • pandas讀取excel,txt,csv,pkl文件等命令的操作
  • python pandas模糊匹配 讀取Excel后 獲取指定指標的操作
  • pandas針對excel處理的實現
  • 關于Python 解決Python3.9 pandas.read_excel(‘xxx.xlsx‘)報錯的問題
  • 解決使用Pandas 讀取超過65536行的Excel文件問題
  • 利用Python pandas對Excel進行合并的方法示例
  • Python pandas對excel的操作實現示例
  • pandas to_excel 添加顏色操作
  • 解決python pandas讀取excel中多個不同sheet表格存在的問題
  • Python pandas如何向excel添加數據
  • pandas中的ExcelWriter和ExcelFile的實現方法
  • pandas實現excel中的數據透視表和Vlookup函數功能代碼
  • Python使用Pandas讀寫Excel實例解析
  • pandas將多個dataframe以多個sheet的形式保存到一個excel文件中
  • 利用python Pandas實現批量拆分Excel與合并Excel

標簽:中山 畢節 駐馬店 湖州 江蘇 呼和浩特 衡水 股票

巨人網絡通訊聲明:本文標題《pandas讀取excel時獲取讀取進度的實現》,本文關鍵詞  pandas,讀取,excel,時,獲取,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《pandas讀取excel時獲取讀取進度的實現》相關的同類信息!
  • 本頁收集關于pandas讀取excel時獲取讀取進度的實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    毛片av一区二区| 欧美日韩极品在线观看一区| 国产精品久久久一本精品| 久久久久久久久久看片| 日日摸夜夜添夜夜添国产精品 | 美女视频免费一区| 欧美日韩国产首页在线观看| 日韩精品中文字幕一区| 久久精品亚洲国产奇米99| 国内精品免费**视频| 成人av电影观看| 91精品国产综合久久久蜜臀粉嫩| 丝袜美腿成人在线| 99久久精品99国产精品| 精品一二线国产| 久久噜噜亚洲综合| 亚洲最大色网站| 欧美一级夜夜爽| 国产福利91精品一区二区三区| 91小视频在线| 94-欧美-setu| 美女视频网站黄色亚洲| 成人h精品动漫一区二区三区| 人人精品人人爱| 国产精品久久看| 精品亚洲aⅴ乱码一区二区三区| 中文字幕亚洲在| 欧美日韩三级一区| 中文字幕中文字幕一区二区| 欧美日韩在线亚洲一区蜜芽| 午夜不卡av在线| 国产无一区二区| 欧美精品久久99久久在免费线 | 日韩精品久久理论片| 国产一区二区福利视频| 偷拍与自拍一区| 国产精品入口麻豆九色| 激情图片小说一区| 国产精品视频免费看| 精品一区二区久久| 成人综合激情网| 久久久久国产一区二区三区四区| 日日夜夜免费精品视频| 91免费在线视频观看| 国产精品大尺度| 久久人人97超碰com| 777午夜精品视频在线播放| 97se亚洲国产综合自在线不卡| 亚洲国产激情av| 成人午夜免费电影| 中文字幕第一页久久| 黑人精品欧美一区二区蜜桃| 欧美一级久久久| 免费成人在线视频观看| 亚洲r级在线视频| 欧洲精品在线观看| 99久久精品一区| 亚洲黄一区二区三区| 午夜精品123| 亚洲123区在线观看| 欧美日韩国产免费一区二区 | 精品剧情在线观看| 欧美高清你懂得| 欧美精品777| 51精品久久久久久久蜜臀| 美女www一区二区| 久久国产精品99久久人人澡| 欧美本精品男人aⅴ天堂| 欧美伊人久久大香线蕉综合69| 蜜臀av一区二区三区| 精品日韩在线观看| 欧美成人一区二区| 成人黄色电影在线| 欧美一区二区美女| 精品国产91洋老外米糕| 大尺度一区二区| 91丨porny丨最新| 日本视频一区二区| 欧美三级乱人伦电影| 欧美军同video69gay| 欧美成人伊人久久综合网| 日韩三级视频在线看| 成人污视频在线观看| 91蜜桃传媒精品久久久一区二区| 免费在线观看视频一区| 久久精品在这里| 国产精品午夜电影| 91麻豆精品国产91久久久| 日韩免费一区二区| 欧美国产日韩精品免费观看| 欧美一a一片一级一片| 欧美一区日韩一区| 在线观看视频91| 国产在线看一区| 香蕉影视欧美成人| 亚洲欧美自拍偷拍色图| 日韩福利视频导航| 一区二区成人在线| 麻豆免费精品视频| 亚洲国产欧美在线| 国产乱国产乱300精品| 在线精品国精品国产尤物884a| 91精品国产乱码久久蜜臀| 日本一区二区动态图| 亚洲国产精品人人做人人爽| 综合电影一区二区三区| 日韩av一区二区在线影视| 日日夜夜免费精品| 一区二区激情小说| 欧美日韩不卡一区二区| 国产成人亚洲精品青草天美| 97国产一区二区| 日韩av在线免费观看不卡| 92国产精品观看| 视频一区二区三区入口| 美洲天堂一区二卡三卡四卡视频| 亚洲制服丝袜在线| 首页国产丝袜综合| 国产日韩欧美一区二区三区乱码| www.亚洲人| 国产精品毛片无遮挡高清| 日本不卡一区二区三区高清视频| 日本一区二区三级电影在线观看| 亚洲高清免费一级二级三级| 亚洲桃色在线一区| 国产精品电影一区二区三区| 老司机精品视频一区二区三区| 91九色02白丝porn| 国产精品久久久久三级| 激情综合网天天干| 日韩免费看网站| 久久精品国产99国产| 色八戒一区二区三区| 欧美三级中文字幕在线观看| 中文字幕av免费专区久久| 亚洲日本在线视频观看| 国产精品第13页| 亚洲亚洲人成综合网络| 国产成人精品1024| 国产一本一道久久香蕉| 欧美一区二区三区四区在线观看 | 麻豆国产精品一区二区三区| 国产在线精品免费av| 欧美一级电影网站| 色综合天天综合网天天看片| 国产日韩精品一区二区三区| 免费在线观看成人| 99久久99久久综合| 色噜噜狠狠色综合中国| 国产福利一区二区| 制服丝袜亚洲色图| 亚洲最大色网站| 午夜不卡在线视频| 91视频91自| 一区二区三区中文在线观看| 免费成人av资源网| 99久久国产综合精品色伊| 美国毛片一区二区| 亚洲线精品一区二区三区八戒| 日韩中文欧美在线| 中文字幕va一区二区三区| 综合色中文字幕| 一区二区久久久久久| 国产精品高潮久久久久无| 成人精品一区二区三区中文字幕| 欧美精品一区二区三区很污很色的 | 亚洲va国产va欧美va观看| 99国内精品久久| 日韩网站在线看片你懂的| 老鸭窝一区二区久久精品| 91亚洲精品一区二区乱码| 亚洲午夜视频在线| 国产福利91精品一区二区三区| 日本中文字幕一区二区有限公司| 精品少妇一区二区| 亚洲成在线观看| 国产日韩欧美综合一区| 日韩电影免费在线看| 欧美三日本三级三级在线播放| 免费观看成人av| 欧美日韩色综合| aaa欧美大片| 国产欧美一区二区精品性| 欧美a级理论片| 一区二区三区日韩在线观看| 国产成人在线电影| 丝瓜av网站精品一区二区| 欧美亚洲一区二区在线| 欧洲精品中文字幕| 成人影视亚洲图片在线| 久久精品视频一区二区三区| 国内成+人亚洲+欧美+综合在线| 69堂成人精品免费视频| 亚洲第一综合色| 欧美一区二区在线视频| 日韩av在线播放中文字幕| 日韩午夜在线播放| 国产日韩成人精品| 欧美精品1区2区3区| 蜜桃视频一区二区三区|