<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          盤(pán)點(diǎn)4種使用Python批量合并同一文件夾內(nèi)所有子文件夾下的Excel文件內(nèi)所有Sheet數(shù)據(jù)

          共 5980字,需瀏覽 12分鐘

           ·

          2021-11-20 21:55




          ????上面鏈接對(duì)應(yīng)的方法進(jìn)行合并,發(fā)現(xiàn)只能夠合并Sheet,其他的就合并不了,這確實(shí)是個(gè)問(wèn)題。

          ????誠(chéng)然,一個(gè)一個(gè)打開(kāi)復(fù)制粘貼固然可行,但是該方法費(fèi)時(shí)費(fèi)力,還容易出錯(cuò),幾個(gè)文件還可以手動(dòng)處理,要是幾十個(gè)甚至上百個(gè),你就抓瞎了,不過(guò)這問(wèn)題對(duì)Python來(lái)說(shuō),so easy,一起來(lái)看看吧!


          二、項(xiàng)目目標(biāo)

          ????用Python實(shí)現(xiàn)多Excel、多Sheet的合并處理,針對(duì)現(xiàn)實(shí)中的切確需求,使用Python批量合并同一文件夾內(nèi)所有子文件夾下的Excel文件內(nèi)所有Sheet數(shù)據(jù),這個(gè)需求在現(xiàn)實(shí)生活中還是挺常見(jiàn)的,所有比較實(shí)用。


          三、項(xiàng)目準(zhǔn)備

          軟件:PyCharm

          需要的庫(kù):pandas,os,glob


          四、項(xiàng)目分析

          1)如何選擇要合并的Excel文件?

          利用os和glob,獲取所有要合并的Excel文件。

          2)如何選擇要合并的Sheet?

          利用pandas庫(kù)進(jìn)行Excel讀取,獲取要合并的Sheet名。

          3)如何合并?

          利用pandas庫(kù),對(duì)所有Sheet名逐一循環(huán)打開(kāi),通過(guò)concat()函數(shù)進(jìn)行數(shù)據(jù)追加合并即可。

          4)如何保存文件?

          利用to_excel保存數(shù)據(jù),得到最終合并后的目標(biāo)文件。


          五、項(xiàng)目實(shí)現(xiàn)

          ????這里提供4種方法給大家,一個(gè)比一個(gè)簡(jiǎn)潔,其中后面三個(gè)方法都是來(lái)自【小小明大佬】提供的,確實(shí)太強(qiáng)了。


          1、方法一

          ????這個(gè)方法是來(lái)自【王寧】大佬的分享,代碼確實(shí)有點(diǎn)多,不過(guò)也是手把手教程,非常詳細(xì),也有注釋,詳情可以戳這篇文章:文科生自學(xué)Python-批量匯總同一路徑內(nèi)所有Excel文件內(nèi)所有Sheet數(shù)據(jù)-基礎(chǔ)知識(shí)1.41,代碼如下。

          # -*- coding: utf-8 -*-import pandas as pdimport datetimeimport os

          # define a starting point of timestart = datetime.datetime.now()

          def Set_Work_Path(x): try: os.chdir(x) route = os.getcwd() print(route) return route except Exception: print("No Result")

          work_path = r"E:\\PythonCrawler\\python_crawler-master\\MergeExcelSheet\\file\\"Set_Work_Path(work_path)

          # define a function to get all the xlsx file names after deleting old file if there.def Get_Dedicated_4Letter_File_List(x): path = os.getcwd() old_name = path + os.sep + "匯總數(shù)據(jù)" + ".xlsx" # dim a txt name if os.path.exists(old_name): os.remove(old_name) files = os.listdir(path) # print(files) #check all files name in the path current_list = [] for i in range(0, len(files), 1): try: if files[i][-4:] == x and files[i][:4] != "匯總數(shù)據(jù)": current_list.append(files[i]) except Exception: pass return current_list

          Current_Excel_list = Get_Dedicated_4Letter_File_List("xlsx")print(Current_Excel_list)

          # define a function to read all sheets one by one in excel filedef Get_All_Sheets_Excel(x): file = pd.ExcelFile(x) list_sht_name = file.sheet_names # get list of sheets' names print(list_sht_name) list_sht_data = [] # get all sheet data sets into a list for i in range(0, len(list_sht_name), 1): list_sht_data.append(pd.read_excel(x, header=0, sheet_name=list_sht_name[i], index_col=None)) # merge all data sets together df = pd.concat(list_sht_data) # delete blank data df.dropna(axis=0, how="all", inplace=True) print(df) return df

          # define a list to get all data from sheets from different excel filesdata_list = []for i in range(0, len(Current_Excel_list), 1): # print(Current_Excel_list[i]) data_list.append(Get_All_Sheets_Excel(Current_Excel_list[i]))data = pd.concat(data_list)data.dropna(axis=0, how="all", inplace=True)print(data)
          # save the data into excel filewriter = pd.ExcelWriter("王寧大佬的匯總數(shù)據(jù).xlsx")data.to_excel(writer, encoding="utf_8_sig", sheet_name="DATA", index=False)# get the target pivot datasetswriter.save()
          end = datetime.datetime.now()run_time = round((end-start).total_seconds()/60, 2)show = "程序運(yùn)行消耗時(shí)間為: %s 分鐘" % run_time+",搞定!"print(show)

          ????上面這個(gè)代碼對(duì)原始數(shù)據(jù)要求比較苛刻,前提條件:所有數(shù)據(jù)都是規(guī)范的數(shù)據(jù)源且字段名和數(shù)據(jù)結(jié)構(gòu)是一樣的。這樣看來(lái),還是有些受限的。不過(guò)不要慌,接下來(lái)【小小明大佬】的這三個(gè)方法,就沒(méi)有這個(gè)限制,下面一起來(lái)看看吧!


          2、方法二

          ????下面這個(gè)代碼是基于【小小明大佬】提供的單Sheet表合并代碼改進(jìn)所得到的,關(guān)鍵點(diǎn)在于將sheet_name=None這個(gè)參數(shù)帶上,代表獲取Excel文件中的所有sheet表,其返回的是一個(gè)字典,所有在后面遍歷的時(shí)候,是以字典的形式進(jìn)行取值的,之后在15行的地方,需要注意使用的是extend()方法進(jìn)行追加,如果使用append()方法,得到的就只有最后一個(gè)表格的合并結(jié)果,這個(gè)坑小編親自踩過(guò),感興趣的小伙伴也可以踩下坑。

          # -*- coding: utf-8 -*-import osimport pandas as pdresult = []path = r"E:\\PythonCrawler\\python_crawler-master\\MergeExcelSheet\\testfile\\file"for root, dirs, files in os.walk(path, topdown=False):    for name in files:        if name.endswith(".xls") or name.endswith(".xlsx"):            df = pd.read_excel(os.path.join(root, name), sheet_name=None)            result.append(df)
          data_list = []for data in result: # print(data.values()) data_list.extend(data.values()) # 注意這里是extend()函數(shù)而不是append()函數(shù)
          df = pd.concat(data_list)df.to_excel("testfile所有表合并.xlsx", index=False)print("合并完成!")


          3、方法三

          ????下面這個(gè)代碼是【小小明大佬】手?jǐn)]的一個(gè)代碼,使用了列表append()方法,效率雖說(shuō)會(huì)低一些,但是處理上百上千個(gè)文件,仍然不在話下。

          ????需要注意的是代碼中的第6行和第7行,獲取文件路徑,其中**代表的是文件夾下的子文件遞歸。另外就是.xls*了,這個(gè)是正則寫(xiě)法,表示的是既可以處理xls格式,也可以處理xlsx格式的Excel文件,真是妙哉!

          # -*- coding: utf-8 -*-import globimport pandas as pdpath = "E:\\PythonCrawler\\python_crawler-master\\MergeExcelSheet\\file\\"data = []for excel_file in glob.glob(f'{path}/**/[!~]*.xls*'):# for excel_file in glob.glob(f'{path}/[!~]*.xlsx'):    excel = pd.ExcelFile(excel_file)    for sheet_name in excel.sheet_names:        df = excel.parse(sheet_name)        data.append(df)# print(data)
          df = pd.concat(data, ignore_index=True)df.to_excel("小小明提供的代碼(合并多表)--glob和pandas庫(kù)列表append方法--所有表合并.xlsx", index=False)print("合并完成!")


          4、方法四

          ????下面這個(gè)代碼是【小小明大佬】手?jǐn)]的另外一個(gè)代碼,使用了sheet_name=None和列表extend()方法,將sheet_name=None這個(gè)參數(shù)帶上,代表獲取Excel文件中的所有sheet表,其返回的是一個(gè)字典,所有在后面遍歷的時(shí)候,是以字典的形式進(jìn)行取值的,效率比前面的方法都要高一些。

          ????需要注意的是代碼中的第6行和第7行,獲取文件路徑,其中**代表的是文件夾下的子文件遞歸。另外就是.xls*了,這個(gè)是正則寫(xiě)法,表示的是既可以處理xls格式,也可以處理xlsx格式的Excel文件,真是妙哉!

          # -*- coding: utf-8 -*-import globimport pandas as pdpath = r"E:\PythonCrawler\python_crawler-master\MergeExcelSheet\file"data = []# for excel_file in glob.glob(f'{path}/**/[!~]*.xlsx'):for excel_file in glob.glob(f'{path}/[!~]*.xlsx'):    dfs = pd.read_excel(excel_file, sheet_name=None).values()    data.extend(dfs)# print(data)
          df = pd.concat(data, ignore_index=True)df.to_excel("小小明提供的代碼(合并多表)--glob和pandas庫(kù)列表extend方法--簡(jiǎn)潔--所有表合并.xlsx", index=False)print("合并完成!")


          六、效果展示

          1、處理前Excel數(shù)據(jù):

          2、運(yùn)行進(jìn)度提示:

          3、合并后的結(jié)果:


          七、總結(jié)

          ????本文從實(shí)際工作出發(fā),基于Python編程,介紹了4種方法,實(shí)現(xiàn)批量合并同一文件夾內(nèi)所有子文件夾下的Excel文件內(nèi)所有Sheet數(shù)據(jù),為大家減少了很多復(fù)制粘貼的麻煩,省時(shí)省力,還不容易出錯(cuò)。代碼不多,循環(huán)追加有點(diǎn)繞,想想也就明白了,不懂的隨時(shí)留言提問(wèn),大家一起學(xué)習(xí)進(jìn)步。

          ????有想法的小伙伴還可以將文章中的代碼進(jìn)行打包,做成一個(gè)exe可執(zhí)行的小軟件,包裝好發(fā)給別人使用,也可以賺點(diǎn)小費(fèi)噢,關(guān)于打包的教程這里不再贅述,歡迎前往:三個(gè)你必須要記住的Pyinstaller打包命令——利用Python實(shí)現(xiàn)打包exe。

          ???




          Python“寶藏級(jí)”公眾號(hào)【Python之王】專注于Python領(lǐng)域,會(huì)爬蟲(chóng),數(shù)分,C++,tensorflow和Pytorch等等。

          近 2年共原創(chuàng) 100+ 篇技術(shù)文章。創(chuàng)作的精品文章系列有:

          日常收集整理了一批不錯(cuò)的?Python?學(xué)習(xí)資料,有需要的小伙可以自行免費(fèi)領(lǐng)取。

          獲取方式如下:公眾號(hào)回復(fù)資料。領(lǐng)取Python等系列筆記,項(xiàng)目,書(shū)籍,直接套上模板就可以用了。資料包含算法、python、算法小抄、力扣刷題手冊(cè)和 C++ 等學(xué)習(xí)資料!

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国内成人做爱视频播放 | 大陆成人一区 | 另类欧美色图 | 久久网逼 | 狼友视频入口 |