python遞歸遍歷文件目錄下,python遞歸遍歷文件夾

本文目錄一覽:

python怎麼用遞歸遍歷多層目錄樹

Python實現遞歸遍歷指定文件目錄(startdir),從而找到所有與指定的文件或目錄(target)名相同的文件或目錄的絕對路徑。

scandir.py :

#! /usr/bin/python

# filename : scandir.py

# author : Jesse

# update : 2011/08/15 10:16

import os

def scandir(startdir, target) :

os.chdir(startdir)

for obj in os.listdir(os.curdir) :

if obj == target :

print os.getcwd() + os.sep + obj

if os.path.isdir(obj) :

scandir(obj, target)

os.chdir(os.pardir) #!!!

startdir = raw_input(‘Please input startdir: ‘)

target = raw_input(‘Please input target: ‘)

scandir(startdir, target)

關於該程序的一點說明:

1. 函數scandir的形參target可以是目錄名也可以是文件名。

2. 函數chdir的作用是切換到指定目錄,該參數必須是有效的且有訪問許可權的相對路徑或絕對路徑。

3. 函數的第五行,使用getcwd函數也是為了取得當前絕對路徑。

4. 加號作為字元串的連接符。os.sep根據你的操作系統給出目錄分隔符,在GNU/Linux和UNIX上它的返回值是’/’,在windows上它的返回值是’\\’,在Mac OS上是『:』,使用os.sep而不直接使用字元,會提高程序的可移植性。

5. 遞歸調用後,一定不能忘了os.chdir(os.pardir),返回上層目錄(即父目錄)。

重要:

1. 理解for中的兩個並列的if語句,並列是為了解決目標是文件夾時,該目標文件夾中包含符合要求的文件夾。

2. 如果指定目錄中存在訪問受限的文件或文件夾,該程序會失敗,返回無權訪問信息。

python遍歷目錄就是這麼簡單

有時我們有列出目錄下都有哪些文件和子目錄的需求,這種情況是有現成命令可用的,比如windows下的dir命令,linux下的ls命令都可以,那我們用python代碼怎麼實現呢?

我們利用python豐富的庫很容易就能實現一個簡易版本,下面我們就用4種方法來實現它。

一、使用os.popen

os.popen工作原理是新建一個子進程,然後用這個子進程執行命令,父進程與子進程間通過管道進行通信。

根據調用popen時的傳參,我們可以通過管道讀取子進程的輸出也可以向子進程寫數據,默認是讀取子進程的輸出。

從以上描述可以看出popen是非常通用的,不是只能用於我們這個例子哦。

那我們開始用它實現我們的需求吧,代碼如下:

哈哈,是不是很簡單,這種方式雖然能達到目的但其實並不是我們想要的,我們本來就是要實現ls的,結果調用了ls,所以嚴格意義上來說我們並沒有實現ls,那讓我們繼續往下看其它方法吧,嘿嘿。

二、使用glob.glob

glob可以根據你使用的通配符對文件進行匹配,利用這個特性我們可以列出當前目錄下都有哪些文件和子目錄,如下代碼:

三、使用os.listdir

os.listdir同樣可以列出某個目錄下都有哪些文件和子目錄,如下代碼:

四、使用os.walk

os.walk在遍歷目錄方面非常強大,它不但可以遍歷你需要的目錄,也可以遞歸遍歷子目錄且遞歸的深度可以用代碼控制,下面讓我們分別看下怎麼遍歷整個目錄樹以及怎麼控制深度吧。

os.walk默認是遍歷整個目錄樹的,如下代碼就會遞歸列印出當前目錄下所有文件:

那我們怎麼控制遍歷的深度,比如只遍歷n層呢?其實很簡單,只需要定義一個深度變數,然後到達n後跳出循環即可,如下代碼就只遍歷1層:

至此我們已經寫完4種方法了,如果你還有其他方法,歡迎評論交流。

python–目錄操作

一、os.getcwd()

獲取當前工作目錄,即當前Python腳本工作的目錄路徑。

二、os. chdir(path)

改變當前腳本工作目錄;相當於shell下的cd命令。

三、os.pardir

返回當前目錄的父目錄(’..’)

四、獲取當前使用的操作系統類型(其中 『nt』 是 windows,』posix』 是linux 或者 unix)。

五、os.mkdir(path [, mode=0777])

生成單級目錄;相當於linux中的mkdir dirname。參數mode表示生成的目錄的許可權,默認是超級許可權,也就是0777。如果重複創建,會報錯

六、os.makedirs(path [, mode=0777])

可生成多層遞歸目錄,父目錄如果不存在,遞歸生成。參數mode表示生成的目錄的許可權,默認是超級許可權,也就是0777。

七、os.removedirs(path)

若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依次類推。

八、os.rmdir(path)

刪除單級空目錄,若目錄不為空則無法刪除,會報錯;相當Linux中的rmdir dirname。

九、os.listdir(path)

列出指定目錄下的所有文件和子目錄,包括隱藏文件或目錄,並以列表形式返回。

十、os.remove(filePath)

刪除一個指定的文件,參數filePath表示文件所在的路徑。

注意:該方法只能刪除文件,不能刪除目錄。

十一、os.rename(oldname, newname)

重命名文件/目錄。

十二、os.access(path, mode)

輸出文件許可權模式。

十三、os.chmod(path, mode)

修改文件的許可權。

十四、os.walk(top, topdown=True, onerror=None, followlinks=False)

➢top:表示需要遍歷的目錄樹的路徑。

➢topdown的默認值是「True」,表示首先返回目錄樹下的文件,然後遍歷目錄樹下的子目錄。值設為False時,則表示先遍歷目錄樹下的子目錄,返回子目錄下的文件,最後返回根目錄下的文件。

➢onerror的默認值是「None」,表示忽略文件遍歷時產生的錯誤。如果不為空,則提供一個自定義函數提示錯誤信息後繼續遍歷或拋出異常中止遍歷。

➢該函數返回一個列表,列表中的每一個元素都是一個元組,該元組有3個元素,分別表示每次遍歷的路徑名,目錄列表和文件列表。

➢默認情況下,os.walk 不會遍歷軟鏈接指向的子目錄,若有需要請將followlinks設定為true

十五、os.path.split(path)

將path分割成目錄和文件名(事實上,如果你完全使用目錄,它也會將最後一個目錄作為文件名而分離,同時它不會判斷文件或目錄是否存在),並存於元組中返回。

十六、os.path.exists(path)

判斷path是否存在,如果存在返回True,否則返回False。

十七、os.path.isfile(path)

判斷path是否是文件,如果是返回True,否則返回False。

十八、os.path.isdir(path)

判斷path是否是目錄,如果是目錄返回True,否則返回False。

十九、os.path.getsize(name)

獲得文件大小,如果name是目錄返回結果是0L或者4096L;如果name代表的目錄或文件不存在,則會報WindowsError異常。

二十、os.path.join(a, *p)

連接兩個或更多的路徑名,中間以「\」分隔,如果所給的參數中都是絕對路徑名,那先給的絕對路徑將會被丟棄。

二十一、os.path.getatime(filename)

返迴文件的最後訪問時間,返回的是時間戳。

二十二、os.path.getctime(filename)

以時間戳的形式返迴文件或目錄的創建時間,在Unix系統上是文件最近更改的時間,在Windows上是文件或目錄的創建時間。

1.基礎題:

    檢驗給出的路徑是否是一個文件:os.path.isfile(“D:\\test.txt”)

    檢驗給出的路徑是否是一個目錄:os.path.isdir(“D:\\test.txt”)

    判斷是否是絕對路徑:os.path.isabs(“D:\\test.txt”)

    檢驗給出的路徑是否真地存在:

2.返回一個路徑的目錄名和文件名 :os.listdir(“D:\\”)

3.分離文件名與擴展名 :os.path.splitext(“D:\\test.txt”)

4.找出某個目錄下所有的文件,並在每個文件中寫入「gloryroad」 :

for files in os.walk(“D:\\test”):

…    print(files)

(‘D:\\test’, [], [‘a.txt’, ‘b.txt’, ‘test.txt’, ‘test1.txt’])

with open(“D:\\test\\a.txt”,”w+”) as f:

…    f.write(“gloryroad”)

5.如果某個目錄下文件名包含txt後綴名,則把文件後面追加寫一行「被我找到了!」

6. 命題練習:

    1) 一個目錄下只有文件(自己構造),拷貝幾個文件(手工完成)

    2 )用listdir函數獲取所有文件,如果文件的創建時間是今天,那麼就在文件裡面寫上文件的路徑、文件名和文件擴展名

    3) 如果不是今天創建(獲取文件的創建時間,並轉化為時間格式,判斷是否今天),請刪除

    4 )計算一下這個程序的執行耗時

7.刪除某個目錄下的全部文件

8.統計某個目錄下文件數和目錄個數

9.使用程序建立一個多級的目錄,在每個目錄下,新建一個和目錄名字一樣的txt文件

10. 查找某個目錄下是否存在某個文件名

11. 用系統命令拷貝文件

12.輸入源文件所在路徑和目標目錄路徑,然後實現文件拷貝功能

13.遍歷某個目錄下的所有圖片,並在圖片名稱後面增加

14、遍歷指定目錄下的所有文件,找出其中佔用空間最大的前3個文件

15、過濾py源碼中的#注釋,另存為文件result.py,並執行result.py,斷言是否執行成功

16、文件訪問,提示輸入數字 N 和文件 F, 然後顯示文件 F 的前 N 行.

17、從命令行接受1個路徑如:c:\a\b\c\1.py, 實現1個函數創建目錄a\b\c,創建文件1.py,實現1個函數刪除已創建的目錄及文件

18、有一個ip.txt,裡面每行是一個ip,實現一個函數,ping 每個ip的結果,把結果記錄存到ping.txt中,格式為ip:0或ip:1 ,0代表ping成功,1代表ping失敗

19、實現DOS命令執行功能,接受輸入命令並執行,然後把執行結果和返回碼列印到屏幕

20、文件訪問

    訪問一存在多行的文件,實現每隔一秒逐行顯示文本內容的程序,每次顯示文本文件的 5行, 暫停並向用戶提示「輸入任意字元繼續」,按回車鍵後繼續執行,直到文件末尾。

    顯示文件的格式為:[當前時間] 一行內容,比如:[2016-07-08 22:21:51] 999370this is test

Python中如何遍歷指定目錄下的所有文件?

例如:在C:\TDDOWNLOAD目錄下有a.txt、b.txt兩個文件,另有\sub1子文件夾,C:\TDDOWNLOAD\sub1下又有c.txt、d.txt兩個文件。

1.

os.walk

os.walk()返回一個三元素的tuple:當前路徑、子文件夾名稱、文件列表。

import

os

def

fun(

path

):…

for

root,

dirs,

files

in

os.walk(

path

):…

for

fn

in

files:…

print

root,

fn…

fun(

r’C:\TDDOWNLOAD’

)C:\TDDOWNLOAD

a.txtC:\TDDOWNLOAD

b.txtC:\TDDOWNLOAD\sub1

c.txtC:\TDDOWNLOAD\sub1

d.txt

2.

glob.glob

glob.glob()只接受一個參數,這個參數既代有路徑,又代有匹配模式,返回值為一個列表。注意,glob.glob()無法直接穿透子文件夾,需要自己處理:

def

fun(

path

):…

for

fn

in

glob.glob(

path

+

os.sep

+

‘*’

):

#

‘*’代表匹配所有文件…

if

os.path.isdir(

fn

):

#

如果結果為文件夾…

fun(

fn

)

#

遞歸…

else:…

print

fn…

fun(

r’C:\TDDOWNLOAD’

)C:\TDDOWNLOAD\a.txtC:\TDDOWNLOAD\b.txtC:\TDDOWNLOAD\sub1\c.txtC:\TDDOWNLOAD\sub1\d.txt

‘*’為匹配模式,代表匹配所有文件,只有這樣才能將子文件夾查出來,以便遞歸深入,探查下一層的文件。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/204501.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-07 12:17
下一篇 2024-12-07 12:17

相關推薦

發表回復

登錄後才能評論