用Python遍歷文件夾下的所有文件並進行數據處理(Pathlib簡介)

2021-02-20 圖靈小庫

在數據分析的日常工作中,我們可能會經常需要處理這樣的問題:將一個或多個文件夾下的文件中的數據進行分析、處理、整合。這些文件通常是相似的或是同類別的,比如我們有多個月份的銷售信息,每個月份的數據分別存在一個excel文檔中;多個類別的銷售信息,每個類的數據分別存在一個excel文檔中等等。像是如圖中所示:

在當前文件夾中存在「files」文件夾,裡面是我們將要分析的數據,在該文件夾目錄下又有如下四個文件夾,我們可以看作是四個大類的數據:

這四個文件夾當中就分別存放著所對應的數據,隨便打開其中一個文件夾,數據文件如圖所示:

 

其中每個文件的內容大致是相同:

所有文件共有128個,每個文件中條目數在幾百行,我們需要分別對這些文件中的數據進行分析,求出每個文件中所屬類目的起始日期、終止日期、平均轉化率、平均客單價,然後匯總到一起輸出一份數據分析報告。如果用excel來一個個處理的話需要處理128次,想想就覺得費力啊!那麼這個時候用上我們的pandas就再合適不過了。這個時候有些朋友會有些疑惑,我們該如何遍歷這些文件並讀取數據呢?本文就通過os庫以及pathlib庫為大家講解,並在最後重點介紹一下pathlib。

首先導入我們需要使用到的庫:

import pandas as pdimport numpy as npimport osfrom pathlib import Pathimport time

設置自己存放文件的根目錄:

file_path = "/Users/***/jupyter_notebook/Python_file_processing/files"

先用os的方法,這裡我們使用os.walk()來遍歷文件名:

可以看到每次遍歷都包含當前文件夾的根路徑、該文件夾下的文件夾、該文件夾下的所有文件列表。通過代碼我們可以輕鬆地將所有文件名整理到一個列表中:

# 存放所有文件名file_list = []# 存放每個子文件夾下所對應的文件名file_dict = {}for iroot, idirs, ifiles in os.walk(file_path):    if not idirs:        ifiles.remove('.DS_Store')        file_list.extend(ifiles)        file_dict[iroot] = ifiles

因為pandas讀取文件需要絕對路徑,所以我們建立一個根路徑與文件名對應的字典,之後拼湊成絕對路徑。file_dict如下圖所示:

這樣我們就可以通過dict.items()來拼接文件的絕對路徑了,然後遍歷讀取文件,分析我們所需要的指標:

start_time = []end_time = []conversion_mean = []category = []unit_price_mean = []
start = time.time()# 遍歷所有文件,拼接路徑for k, v in file_dict.items(): for i in v: file_name = os.path.join(k, i) file = pd.read_excel(file_name) start_time.append(file['日期'].min()) end_time.append(file['日期'].max()) conversion_mean.append(file['轉化率'].mean()) category.append(file['三級類目'].unique()[0]) # 文件中有inf值 unit_price_mean.append(file['客單價'].replace(np.inf, np.nan).dropna().mean())
output_file = pd.DataFrame({'起始日期': start_time, '終止日期': end_time, '平均轉換率': conversion_mean, '所屬類目': category, '平均客單價': unit_price_mean})cost = round(time.time() - start, 2)print(f'處理數據共用時{cost}秒')

最後輸出分析報告,共128個條目:

接下來我們用pathlib來遍歷文件,可能比os要方便一些。

首先設置文件目錄:

讓我們看一下通過pathlib的方法是如何遍歷的:

# 所有以xlsx結尾的文件for file in p.rglob('*.xlsx'):    print(file)

可以看到,通過pathlib.Path.rglob()方法可以直接遍歷匯總所有文件的絕對路徑,直接用pandas讀取即可:

start_time = []end_time = []conversion_mean = []category = []unit_price_mean = []
start = time.time()# 直接遍歷出文件絕對路徑for file_name in p.rglob('*.xlsx'): file = pd.read_excel(file_name) start_time.append(file['日期'].min()) end_time.append(file['日期'].max()) conversion_mean.append(file['轉化率'].mean()) category.append(file['三級類目'].unique()[0]) unit_price_mean.append(file['客單價'].replace(np.inf, np.nan).dropna().mean())
output_file1 = pd.DataFrame({'起始日期': start_time, '終止日期': end_time, '平均轉換率': conversion_mean, '所屬類目': category, '平均客單價': unit_price_mean})cost = round(time.time() - start, 2)print(f'處理數據共用時{cost}秒')

這樣,通過pandas的方法我們一下子就處理完了所有數據,只用時2秒,和手動用excel一個個處理相比太方便了,而pathlib庫的使用更加方便了我們代碼的編寫。

 

Pathlib簡介:

得到當前目錄:

拼接路徑,得到想要的文件的絕對路徑:

p_new = p.joinpath('files', 'files32_1', '戶外服裝&潛水服.xlsx')

得到路徑文件:

得到路徑文件的名稱:

得到路徑文件的後綴:

得到路徑文件的上一級目錄:

得到路徑的每一級:

判斷路徑文件是否存在:

判斷路徑文件是否為文件夾:

判斷路徑文件是否為文件:

創建新文件夾:

p_dir = Path(Path.cwd().joinpath('created_dir'))p_dir.mkdir(exist_ok=True, parents=True)

創建文件夾之前:

創建文件夾之後: 

 修改路徑文件的文件後綴(with_shuffix修改後綴,with_name修改文件名):

p_new.replace(p_new.with_suffix('.txt'))

刪除路徑文件:

完整代碼可關注公眾號「數據科學與人工智慧技術」並發送文字「pathlib」獲取

感謝觀看!

 

相關焦點

  • 文件操作So Easy!來,一起體驗下Python的Pathlib模塊~
    前言大多人處理文件用的最多的還是os模快吧,比如下面這樣的操作:>>> path.rsplit('\\', maxsplit=1)[0]或者寫出下面這樣長長的代碼>>> os.path.isfile(os.path.join
  • python筆記4-遍歷文件夾目錄os.walk()
    並且找出某個後綴的所有文件一、walk功能簡介1.os.walk() 方法用於通過在目錄樹種遊走輸出在目錄中的文件名,向上或者向下。2.walk()方法語法格式如下:os.walk(top,topdown=True,onerror=None, followlinks=False)- top 根目錄下的每一個文件夾(包含它自己), 產生3-元組 (dirpath, dirnames, filenames)【文件夾路徑, 文件夾名字, 文件名】。
  • Python文件處理實用指南
    對文件的操作算是Python中一個基礎又重要的知識點了,無論是在爬蟲、數據分析、Web開發,還是在編寫圖形界面、進行數據分析,都有可能需要用到文件相關的操作
  • 數據處理技巧 | glob - 被忽略的超強文件批量處理模塊
    涉及的內容主要如下:Python-glob模塊簡介glob模塊通配符glob模塊是python自己帶的一個文件操作模塊,可以查找符合自己需求的的文件,並且支持通配符操作,主要包括以下三種匹配模式:**匹配所有文件,包括目錄,子目錄和子目錄裡面的文件。
  • 用Python進行通用文件系統操作
    前言熟悉Windows系統的同學肯定對於用滑鼠右鍵對文件進行複製粘貼刪除操作都很熟悉,有一些同學也許會熟悉命令行的批處理命令,比如copy、rm等,其實利用
  • 一文看懂Python對文件和文件夾的操作: 含os, shutil和glob模塊.Python學習面試必讀.
    在利用Python或Django從事Web開發時除了必須要了解Python面向對象的編程思想,還必須熟練掌握對文件夾和文件的操作。小編我精心準備了個小結,教你如何利用python進行基本的文件和文件夾操作,並重點介紹了如何使用os, shutil和glob模塊進行常見的文件和文件夾操作,如遍歷,刪除文件和查找文件。
  • Python 文件與目錄操作方法總結
    要獲取文件系統中特定目錄下的所有文件和文件夾的列表,請在舊版本的 Python 中使用os.listdir();或在 Python 3.x 中使用os.scandir()。 如果你還想獲取文件和目錄屬性(如文件大小和修改日期),則os.scandir()是首選方法。
  • 『Python/Linux』對大批量文件進行重命名
    在日常生活中,我們偶爾會碰到類似這樣的問題——需要對某個文件夾內的部分或全部文件進行重命名,以便於更好的進行分類和整理但有時這個過程會極耗時間,比如對手機上傳到電腦的照片進行重命名,特別是當文件個數達到成百上千張時,笨比才會想手動地一張一張改名然而,當重命名成為一種剛性需求時(某些算法中就有這種硬性要求),我們就必須藉助python或者其他工具去實現了
  • python批量遍歷文件,並清除文件中的幹擾字符
    本教程使用的課本是《Python編程:從入門到實踐》,作者:[美] Eric Matthes相信很多人有批量處理文本內容的需求,比如從網上下載了很多文本文件,但裡面有些文字需要去除,用Python的OS類可以輕鬆實現。
  • 【Python基礎】Python十大文件騷操作!!
    來源:Python數據科學作者:東哥起飛日常對於批量處理文件的需求非常多,用Python寫腳本可以非常方便地實現,但在這過程中難免會和文件打交道,第一次做會有很多文件的操作無從下手,只能找度娘。該函數將在指定的路徑下創建目錄,如果僅使用目錄名稱,則將在當前目錄中創建文件夾,即絕對路徑和相對路徑的概念。
  • Qt:選取文件夾 遍歷子文件夾和文件
    採用遞歸和QDir實現文件夾下所有文件遍歷的方法#ifndef MAINWINDOW_H
  • Python尚學堂高淇|P137-P139OS模塊,文件和目錄的操作,使用walk遍歷os.path模塊
    os 模塊下常用操作文件的方法方法名描述remove(path)刪除指定的文件rename(src,dest)重命名文件或目錄stat(path)返回文件的所有屬性listdir(path)返回 path 目錄下的文件和目錄列表
  • 讀取、創建和運行多個文件的3個Python技巧
    動機將代碼投入生產時,你很可能需要處理代碼文件的組織。讀取、創建和運行許多數據文件非常耗時。本文將向你展示如何自動循環訪問目錄中的文件如果不存在嵌套文件,創建它們使用bash for loop運行一個具有不同輸入的文件這些技巧為我在數據科學項目中節省了很多時間。我希望你也會發現它們有用!
  • Python的os / shutil / Path 模塊介紹
    一、os 的簡單介紹提供了非常豐富的方法用來處理文件和目錄。二、shutil 的簡單介紹高級的文件 文件夾 壓縮包 處理模塊三、pathlib 的簡單介紹官方定義:Object-oriented filesystem paths(面向對象的文件系統路徑)官方推薦:pathlib是一個從3版本開始就能完全替代os.path的內置庫,在python官網中這樣說 "對於字符串的低級路徑操作,您也可以使用該
  • 8個例子掌握Python的Pathlib模塊
    引言Python 的 pathlib 模塊使處理文件路徑變得非常簡單和高效。os.path模塊也可以用於處理路徑名操作。不同之處在於path模塊創建表示文件路徑的字符串,而pathlib創建路徑對象。使用路徑對象而不是字符串的一個重要優點是,我們可以在路徑對象上調用方法。
  • VBA代碼大全010:用vba遍歷文件夾及其子文件夾內的文件
    循環處理多個單元格的內容,循環處理多個工作表的內容,循環處理多個工作簿的內容。其中又以循環處理多個文件最為頻繁,一個excel工作簿內的內容循環有些人還可以藉助函數來實現,但是涉及到多個文件的循環處理時,用函數就顯得無力回天,這時候就需要祭出vba大招了。
  • Python內置的文件夾操作
    點擊關註上方「Python數據分析實例」設為「置頂或星標」,送達乾貨不錯過!文件夾主要用於分層保存文件,通過文件夾可以進行區別存放文件。pass注意:Python中指定文件路徑時需要對路徑分隔符"\"進行轉義,即"\"替換為"\\";也可以將路徑分隔符"\"採用"/"代替;或直接複製文件夾路徑字符串前面加r即可。
  • Python十大文件騷操作!!
    該函數將在指定的路徑下創建目錄,如果僅使用目錄名稱,則將在當前目錄中創建文件夾,即絕對路徑和相對路徑的概念。Is the directory there: True如果使用最新版本的Python(≥3.4),則可以考慮利用pathlib模塊創建新目錄。它不僅可以創建子目錄,而且可以處理路徑中所有丟失的目錄。
  • 圍觀大神是如何用 Python 處理文件的?
    建議一:使用 pathlib 模塊如果你需要在 Python 裡進行文件處理,那麼標準庫中的 os 和 os.path 兄弟倆一定是你無法避開的兩個模塊。在這兩個模塊裡,有著非常多與文件路徑處理、文件讀寫、文件狀態查看相關的工具函數。讓我用一個例子來展示一下它們的使用場景。有一個目錄裡裝了很多數據文件,但是它們的後綴名並不統一,既有 .txt,又有 .csv。
  • Python辦公自動化不得不會的十大文件操作!
    該函數將在指定的路徑下創建目錄,如果僅使用目錄名稱,則將在當前目錄中創建文件夾,即絕對路徑和相對路徑的概念。Is the directory there: True如果使用最新版本的Python(≥3.4),則可以考慮利用pathlib模塊創建新目錄。它不僅可以創建子目錄,而且可以處理路徑中所有丟失的目錄。