题目:编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径
题目不难,但是初接触Python,对函数不够熟悉,犯了不少错误。总结如下:
os.path.isdir()方法应该传入带绝对路径的文件名,如:r'e:\java',如果只是传入文件名,如'java',该方法只会在当前工作目录(可以用os.getcwd()查看)下查找有没有同名文件夹,有则返回true
os.listdir()方法只返回文件名,需要自己用os.path.join()方法拼接出绝对路径。
os.path.realpath()获取绝对路径,该方法会将传入的文件名与当前工作目录拼接出绝对路径。如果要使用这个方法,必须先用os.chdir()改变当前工作目录!建议优先用os.path.join()。
os.path.relpath()获取相对路径,如果不传入命名关键字参数start,如start = r'C:\python',则该方法会与根据当前工作目录计算相对路径,目录不同则报错。
非递归版本:
import os dir = r'e:\java' specify_str = 'm' # 搜索指定目录 results = [] folders = [dir] for folder in folders : # 把目录下所有文件夹存入待遍历的folders folders += [os.path.join(folder, x) for x in os.listdir(folder) \ if os.path.isdir(os.path.join(folder, x))] # 把所有满足条件的文件的相对地址存入结果results results += [os.path.relpath(os.path.join(folder, x), start = dir) \ for x in os.listdir(folder) \ if os.path.isfile(os.path.join(folder, x)) and specify_str in x] # 输出结果 for result in results: print(result) print('找到 %s 个结果!' % len(results))
输出如下:
E:\java\Combination.class E:\java\Combination.java E:\java\Combination1.class E:\java\Combination1.java E:\java\FrameTest$1.class E:\java\FrameTest.class E:\java\FrameTest.java E:\java\game.jar E:\java\getNum.java E:\java\Java学习笔记.markdown E:\java\Jsq$CommandAction.class E:\java\map0.txt E:\java\MOMNum.java E:\java\MyComp.class E:\java\NumRectangle.class E:\java\NumRectangle.java E:\java\Prime E:\java\Prime.class E:\java\Prime.java E:\java\RandomCharNum.class E:\java\RandomCharNum.java E:\java\Sum.class E:\java\Sum.java E:\java\SuoDemo.class E:\java\SuoDemo.java E:\java\TestFrame.class E:\java\HomeWork\HomeWork.java E:\java\HomeWork\Thumbs.db E:\java\m个数中取k个数\Combination.class E:\java\m个数中取k个数\Combination.java E:\java\m个数中取k个数\Combination1.class E:\java\m个数中取k个数\Combination1.java E:\java\m个数中取k个数\Combination2.java E:\java\五子棋\GameFrame.class E:\java\五子棋\GameFrame.java E:\java\以往习作\KingTetris$timerListener.class E:\java\小成图排盘\EightDiagram.java E:\java\年份转干支\HeavenlyStem.class E:\java\年份转干支\HeavenlyStem.java E:\java\打包\Game$1.class E:\java\打包\Game$2.class E:\java\打包\Game$MyCanvas.class E:\java\打包\Game.class 找到43个满足条件的文件。