Python自動化辦公

pythonputao發表於2020-12-05

背景

故事是這樣的,我的一個朋友他有十多個 excel 檔案需要合併~當時給他提供了實現的思路。但轉身一想,萬一我的朋友中還有需要如此重複操作耽誤了與小姐姐約會咋辦?不行,你們不能跟我一樣。所以為了美好的明天,今兒還是好好學習吧~

實戰

「 需求 」 將 files 資料夾下的所有檔案的資料合併成一個總檔案(注意:每個檔案的表頭都一致)

「 實現步驟 」

  • 獲取 files 資料夾下的所有檔名稱

  • 讀取每個檔案的資料

  • 將每個檔案的資料進行拼接

  • 儲存至新的檔案

「 獲取 files 資料夾下的所有檔名稱 」

首先,我們應該思考的是,Python有沒有對應的模組可以幫助我們去獲取指定資料夾下所有檔案的名稱,那資料夾實際上是在作業系統上的(比如:windows,mac),所以,我們就可以使用Python與作業系統互動的模組:os模組

# 匯入os
import os

# 改變當前工作路徑 至所有檔案所在的資料夾下
need_dir = os.chdir(r"C:\Users\lenovo\Desktop\data_ana02\04-auto_merge_files\files")

# 列出所有檔案的名稱 以列表呈現
need_file_name = os.listdir(need_dir)
need_file_name
複製程式碼

執行效果

「 讀取每個檔案的資料 」

在這兒,我們就需要思考,怎麼讀取檔案的資料?哇奧~在 Python 中,那是有相當多的模組可以讀取呀,比如:xlrd,openpyxl,numpy,pandas..那選擇誰呢?在這個應用場景下,我強烈推薦 pandas

# 匯入pandas
import pandas as pd
# 讀取 雲南白藥.csv
ylby_df = pd.read_csv("雲南白藥.csv")
# 顯示前五條
ylby_df.head()
複製程式碼

執行效果

大家會發現,讀取不同的檔案只需要傳入不同的檔名就行,那我們怎麼讀取資料夾下列表的所有檔案的資料呢?

  • 使用 for 迴圈遍歷檔案列表

  • 再讀取資料

# 取出每個檔案的名稱
for file_name in need_file_name:
    # 讀取每個檔案的資料    
    data = pd.read_csv(f"{file_name}")
    print(data.head())
複製程式碼

擷取其中一部分

「 將每個檔案的資料進行拼接 」

怎麼將資料如下拼接呢?

那還是使用到我們的老朋友pandas,我們可以使用 pandas.concat() 堆疊拼接。比如,兩個表格的拼接程式碼如下

# 獲取 雲南白藥.csv 資料
ylby_df = pd.read_csv("雲南白藥.csv")

# 獲取 五糧液.csv 資料
wly_df = pd.read_csv("五糧液.csv")

# 進行堆疊拼接,注意:多個表格的拼接傳入元組或列表
pd.concat((ylby_df,wly_df))
複製程式碼

執行效果

那所有檔案的資料怎麼拼接?此時我們就需要藉助到 pandas.concat() 拼接資料,實質上是將每個 df 資料裝進一個 列表或者元組中,傳進去~

# 定義 空的資料列表
data_li = []

# 取出每個檔案的名稱
for file_name in need_file_name:
    # 讀取每個檔案的資料    
    data = pd.read_csv(f"{file_name}")
    
    # 將資料新增到 空的資料列表中
    data_li.append(data)
    
# print(len(data_li))   # 列表長度返回為4 ,說明構建成功

# 拼接所有檔案的資料
all_data = pd.concat(data_li)  

# 獲取資料的形狀 為620行,說明成功
all_data.shape
複製程式碼

「 儲存至新的檔案 」

儲存檔案直接使用 df.to_csv() 就好了

all_data.to_csv("總資料.csv")  
複製程式碼

...不管你資料夾下多少個檔案都是一樣的,趕緊玩起來吧~

「 完整程式碼 」

import os
import pandas as pd

# 改變當前工作路徑 至所有檔案所在的資料夾下
need_dir = os.chdir(r"C:\Users\lenovo\Desktop\data_ana02\04-auto_merge_files\files")
# 列出所有檔案的名稱 以列表呈現
need_file_name = os.listdir(need_dir)
def concat_file(file_name_li):
    data_li = []   
    # 3.迴圈取出每個 檔名
    for file_name in file_name_li:
        # 讀取資料
        # print(file_name)
        data = pd.read_csv(f"{file_name}")
        # 將讀取的資料新增到一個列表中
        data_li.append(data)  
    # 進行拼接
    all_data = pd.concat(data_li)
    # 儲存檔案
    all_data.to_csv("總資料.csv")  
concat_file(need_file_name) 
複製程式碼

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理

想要獲取更多Python學習資料可以加QQ:2955637827私聊或加Q群630390733大家一起來學習討論吧!

相關文章