1. 程式人生 > >編寫一個search(s)的函式,將當前目錄及其所有子目錄下查詢檔名包含指定字串的檔案,列印完整路徑

編寫一個search(s)的函式,將當前目錄及其所有子目錄下查詢檔名包含指定字串的檔案,列印完整路徑

最後的練習:編寫一個search(s)的函式,能在當前目錄以及當前目錄的所有子目錄下查詢檔名包含指定字串的檔案,並打印出完整路徑

在編寫的過程中,對目錄遍歷的寫法有疑惑。經過除錯和搜尋,定位到
os.path.isfile有問題:

最後完成結果:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2017-05-24 15:52:01
# @Author  : kk ([email protected])
# @Link    : http://blog.csdn.net/PatrickZheng

import os, pdb, logging
logging.basicConfig(level=logging.DEBUG)

def
search_dir(path, L):
current_dir = os.listdir(path) # pdb.set_trace() for n in current_dir: # pdb.set_trace() new_path = os.path.join(path, n) if os.path.isfile(new_path): # 需傳入路徑而非僅僅檔名,否則是FALSE logging.debug('%s is a file.' % n) L.append(new_path) else
: search_dir(new_path, L) return L def search(s): L = search_dir('.', []) # pdb.set_trace() for file in L: # pdb.set_trace() if file.find(s) != -1: logging.info('找到包含%s的檔案路徑:%s' % (s, os.path.abspath(file))) # os.path.abspath(url) 並非返回url真正完整的絕對路徑,只是將當前目錄與url進行join操作
# 例如,當前目錄為 D:/workplace # url是 test.txt,實際是在 ./aaa/test.txt # 但該函式返回的是 D:/workplace/test.txt if __name__ == '__main__': search('test')

後來搜尋了遍歷目錄方法,找到了 os.walk():

這個練習的結果就可以寫的比較簡潔:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2017-05-24 17:21:59
# @Author  : kk ([email protected])
# @Link    : blog.csdn.net/PatrickZheng

import os, logging

def search(s):
    rootdir = '.'       # 指明被遍歷的資料夾

    #三個引數:分別返回1.父目錄 2.所有資料夾名字(不含路徑) 3.所有檔名字
    for parent,dirnames,filenames in os.walk(rootdir):
         for filename in filenames:      #輸出檔案資訊
            #print "filename is:" + filename
            if filename.find(s) != -1:
                print "the full path of the file is:" + os.path.abspath(os.path.join(parent,filename)) #輸出檔案路徑資訊

if __name__ == '__main__':
    search('test')