解决思路
对于像我这种刚开始入门计算机的人,解决问题最关键的是思路的学习,很多时候代码,一看就懂,一写就废。
像这个题目,我们可以用程序的思维,一步一步去解决,将问题细分,细分成你能够解决的问题然后再处理问题,这样看似一个无法下手的题目,就变得可以下手
- 搜索出当前目录下的文件(不包括子目录的文件),并打印文件名
- 搜索出当前目录下的所有文件(包括子目录的文件),并打印文件名
- 搜索出当前目录下的所有文件(包括子目录的文件),并打印文件名包含指定字符串的文件
- 搜索出当前目录下的所有包含指定字符串的文件(包括子目录的文件),并打印相对路径
然后开始一个问题一个问题地解决:
解决第一问题:
搜索出当前目录下的文件(不包括子目录的文件),并打印文件名
import os
def search_file(path):
for x in os.listdir(path):#遍历当前目录下的所有内容,包括文件和子目录
next_file=os.path.join(path,x)
if os.path.isfile(next_file):#筛选出文件
print(x)
p=input('输入指定当前目录:')
search_file(p)
记得找个路径测试一下。
>>>
============================= RESTART: C:\日常学习代码.py ============================
输入指定当前目录:C:\Users\易鹏\Documents\文件夹
1.pdf
Drawing2-模型.pdf
GB 51251-2017建筑防烟排烟系统技术标准(正式版).pdf
plot.log
ThisWorkbook.cls
{ 三维}2.jpg
体量.rfa
原理图.dwg
外装.0001.rvt
外装.0002.rvt
外装.0003.rvt
外装.0004.rvt
外装.rvt
屋顶大样.pdf
屋顶平面.pdf
屋顶设计图.dwg
建筑上标高.rfa
建筑标高.rfa
徐州地铁3号线项目返场人员花名册日报表(1).xlsx
微信图片_20190802112018.jpg
第1页.pdf
第2页.pdf
算量模板.xlsx
行列高光显示.bas
>>>
解决第二个问题
搜索当前目录下所有文件(包括子目录中的文件),并打印文件名
这个问题是关键的问题,也是比较难的一点,我们想目录下面可能有子目录,子目录下面可能还有子目录,这时我们只有用递归去解决或者使用循环去解决,因为我们没法知道有多少级目录。
首先,理解比较好理解的递归函数。在一个问题中,我们写出了一个程序,功能是输入目录,输出目录下的所有文件名,那么用递归就很方便了,直接上代码:(解决根问题后,我们再将循环的方法)
import os
def search_file(path):
for x in os.listdir(path):
next_path=os.path.join(path,x)
if os.path.isfile(next_path):
print(x)
else:
search_file(next_path)
p=input('输入指定当前目录:')
search_file(p)
解决第三个问题
搜索出当前目录下的所有文件(包括子目录的文件),并打印文件名包含指定字符串的文件
因为我们打印的文件名其实是以字符串的方式存储的,所以解决这个问题的核心在于怎么判断一个字符串包含某个字符或者字符串。其实这里非常简单,举个例子:
>>> 'ab' in 'abc'
True
>>>
看到例子就恍然大悟,原来用逻辑判断in就可以做到,刚开始没想到这个主是因为没有意识到一个小小的字符逻辑操作竟然有这么大的威力。
知道了核心,我们直接上代码:
import os
def search_file(path,str):
for x in os.listdir(path):
next_path=os.path.join(path,x)
if os.path.isfile(next_path):
if str in x:
print(x)
else:
search_file(next_path,str)
p=input('输入指定当前目录:')
str=input('输入指定字符串或字符:')
search_file(p,str)
运行结果:
>>>
============================= RESTART: C:\日常学习代码.py ============================
输入指定当前目录:C:\Users\易小白\Documents\文件夹
输入指定字符串或字符:图
#运行结果:
图片1.png
总图简图.jpg
原理图.dwg
屋顶设计图.dwg
微信图片_20190802112018.jpg
>>>
第四个问题
搜索出当前目录下的所有包含指定字符串的文件(包括子目录的文件),并打印相对路径
解决这个问题的关键,在于怎么打印相对路径,什么是相对路径;
相对路径是一个不难理解的概念,比如你打开了一个文件目录,里面有一个‘测试’文件夹,这个文件夹有一个‘test.txt’文件,那么这个文件对于文件目录来说相对路径就是“测试\test.txt”
那么如何打印相对路径呢,我们发现相对路径等于文件的绝对路径减去当前目录的路径,我们可以通过字符操作达到目的,但是需要很多行代码,还好python的os模块中,有一个os.path.relpath(abspath,path)功能,这个功能就是打印绝对路径的功能。
功能演示:
>>> os.path.relpath('C:\\Windows', 'C:\\')
'Windows'
我们看出功能就是去掉路径的相同部分,留下来的就是绝对路径,当然这个函数只能用来操作路径,不能操作普通字符。
上最终的代码:
import os
def search_file(path,str):
for x in os.listdir(path):
next_path=os.path.join(path,x)
if os.path.isfile(next_path):
if str in x:
print(os.path.relpath(next_path,p))#这里使用了固定的变量p,为了增强可读性,可以先定义
else:
search_file(next_path,str)
p=input('输入指定当前目录:')
str=input('输入指定字符串或字符:')
search_file(p,str)
运行结果:
>>>
============================= RESTART: C:\日常学习代码.py ============================
输入指定当前目录:C:\Users\易鹏\Documents\文件夹
输入指定字符串或字符:图
PPT模板\图片1.png
PPT模板\总图简图.jpg
原理图.dwg
屋顶设计图.dwg
微信图片_20190802112018.jpg
>>>
对比第3个问题的结果:文件名有了相对路径
>>>
============================= RESTART: C:\日常学习代码.py ============================
输入指定当前目录:C:\Users\易鹏\Documents\文件夹
输入指定字符串或字符:图
图片1.png
总图简图.jpg
原理图.dwg
屋顶设计图.dwg
微信图片_20190802112018.jpg
>>>