python需要讀取多個不同深度的檔案夾下的某種指定格式的檔案,該如何批量操作呢?
-
一. 常用函式介紹:
首先, 先介紹幾個常用的函式:
1. os.listdir()
os.listdir(path) # 用于回傳指定的檔案夾包含的檔案或檔案夾的名字的串列,它不包括 . 和 .. 即使它在檔案夾中,只支持在 Unix, Windows 下使用,
例如:

import os
dir_path = 'E:/test'
dirs = os.listdir(dir_path)
print(dirs)
結果:![]()
2. os.path.join()
os.path.join(path1, path2, path3,...) # 連接兩個或多個路徑
例如:
import os
path1 = 'E:\\'
path2 = 'test'
path3 = 'aa'
dir_path = os.path.join(path1, path2, path3)
print(dir_path)
結果:
3. os.path.isdir()
os.path.isdir(path) # 函式判斷某一路徑是否為目錄, 如果是目錄, 回傳True, 否則回傳False,
例如:
import os
path1 = 'E:\\test\\aa'
path2 = 'E:\\test\cc.docx'
print(os.path.isdir(path1), os.path.isdir(path2))
結果:
4. os.path.isfile()
os.path.isfile(path) # 判斷某一路徑是否為檔案,如果是檔案,回傳True,否則回傳False,類似于os.path.isdir()
5. os.path.exits()
os.path.exists(path) # 判斷路徑是否存在, 如果path存在,回傳True;如果path不存在,回傳False,
例如:
import os
path1 = 'E:\\test\\aa'
path2 = 'E:\\test\cc'
print(os.path.exists(path1), os.path.exists(path2))
結果:
6. os.mkdir()
os.mkdir(path) # 創建目錄,path可以是相對路徑或者絕對路徑,如果目錄有多級,則創建最后一級,如果最后一級目錄的上級目錄有不存在的,則會拋出一個 OSError,
import os
path = 'E:\\test\\ff'
os.mkdir(path)
代碼運行前后對比:

7. copyfile()
copyfile(source_file, distination_file) # 將原內容復制到目標檔案中
例如:
from shutil import copyfile
source_path = 'E:\\test\cc.docx'
destination_path = 'E:\\test\\aa\cc.docx'
copyfile(source_path, destination_path)
代碼運行前后對比:

-
二. 實體場景及代碼:
1. 通用代碼:
函式遞回呼叫:定義findfile(path)函式, 采用了函式的遞回呼叫,自己呼叫自己
功能:尋找某一目錄下(所有目錄深度)的所有某種特定的檔案,并對它進行某種操作,比如統計數目、拷貝等,
注意:python3默認遞回的深度不能超過100層
import os
from shutil import copyfile
# import sys
def findfile(path):
'''
尋找某一目錄下(所有目錄深度)的所有某種特定的檔案,并對它進行某種操作
'''
lsdir = os.listdir(path)
files = [i for i in lsdir if os.path.isfile(os.path.join(path, i))]
dicts = [i for i in lsdir if os.path.isdir(os.path.join(path, i))]
if files:
for i in files:
if i.split('.')[-1] == 'docx':
# 計數操作,統計所有.docx檔案的數目
global num
num+= 1
# 此處可以加任意其他操作
if dicts:
for i in dicts:
findfile(os.path.join(path, i))
num = 0
path = 'G:\wc\PLNet'
findfile(path)
print(num)
2. 衍生代碼:
在此通用代碼基礎上可以進行修改,并且衍生出一些其他實際應用場景特定功能的函式代碼
例如,我遇到的一個實際應用場景如下:
現在有一個分類后的大型資料集,由于分類的精細度不同,每一個raw.lfp檔案所存放的目錄深度相差很大,有的2-3層深,有的10幾層深,現在需要將整個目錄下所有的raw.lfp文件進行讀取,并拷貝到一個新的目錄下,而新的目錄是,新建一個目錄,在此目錄內再新建每一個檔案原來所在的上一級的原目錄名的目錄檔案夾,并意義對應存放該檔案raw.lfp,
具體代碼如下:
import os
from shutil import copyfile
# import sys
def findfile(path, new_path):
'''
尋找某一目錄下(所有目錄深度)的所有某種特定的檔案,并對它進行拷貝操作
path: 原檔案目錄
new_path: 拷貝后存放檔案的目錄
'''
lsdir = os.listdir(path)
files = [i for i in lsdir if os.path.isfile(os.path.join(path, i))]
dicts = [i for i in lsdir if os.path.isdir(os.path.join(path, i))]
if files:
for i in files:
if i == 'raw.lfp':
# 計數操作,統計數目
global num
num+= 1
# 此處可以加任意其他操作,
# 比如將此檔案拷貝到某一個指定的目錄下,新建每一個檔案所在的上一級原目錄名,并存放該檔案
each_path = os.path.join(new_path, path.split('\\')[-1])
if not os.path.exists(each_path):
os.mkdir(each_path)
copyfile(os.path.join(path, i), os.path.join(each_path, i))
if dicts:
for i in dicts:
findfile(os.path.join(path, i),new_path)
num = 0
path = 'G:\wc\PLNet'
new_path = 'G:\wc\PLNet_new'
if not os.path.exists(new_path):
os.mkdir(new_path)
findfile(path, new_path)
print(num)
代碼運行前后對比:

參考:
https://blog.csdn.net/qq_28888837/article/details/88060376
https://www.cnblogs.com/sunbeibei/p/13807501.html
https://www.cnblogs.com/keeptg/p/10944109.html
https://www.cnblogs.com/dachenzi/p/6095687.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/277330.html
標籤:python
上一篇:金三銀四已接近尾聲,進大廠,你準備好了嗎?過五關斬六將七輪面試終拿互聯網大廠Offer!!(建議收藏)
下一篇:筆試編程題
