用 Python 实现文件查找(BIF实现及队列实现)
(1)利用内置函数实现文件查找
1、功能:返回用户输入的文件的绝对路径
2、设计思路:
- (1)用户输入在哪个盘进行查找
- (2)遍历此盘文件,若为目标文件则输出
- (2)无此文件,则输出错误
3、实验代码
#查找某个目录下的目标文件
import os #引入操作系统模块
import sys #用于标准输入输出
def search(path,name):
for root, dirs, files in os.walk(path): # path 为根目录
if name in dirs or name in files:
flag = 1 #判断是否找到文件
root = str(root)
dirs = str(dirs)
return os.path.join(root, dirs)
return -1
path = input('请输入您要查找哪个盘中的文件(如:D:\)')
print('请输入您要查找的文件名:')
name = sys.stdin.readline().rstrip() #标准输入,其中rstrip()函数把字符串结尾的空白和回车删除
answer = search(path,name)
if answer == -1:
print("查无此文件")
else:
print(answer)
4、运行结果展示
1、无此文件
2、有此文件
(2)队列实现文件查找
1、设计思路
定义队列 ALLFiles 存储所有文件
while ALLFiles 不为空
if pop 为目录
then 将目录内所有文件入队
elesif pop 为文件
then if 为目标文件
then break
end
输出路径
2、实验代码
#查找某个目录下的目标文件
import os #引入操作系统模块
import sys #用于标准输入输出
import easygui as g #引入图形用户界面
def search(path1,name):
Allfiles = [] #创建队列
Allfiles.append(path1)
while len(Allfiles) != 0: #当队列中为空的时候跳出循环
path =Allfiles.pop(0) #从队列中弹出首个路径
if os.path.isdir(path): #判断路径是否为目录
ALLFilePath =os.listdir(path) #若是目录,遍历将里面所有文件入队
for line in ALLFilePath:
newPath =path +"\"+line #形成绝对路径
Allfiles.append(newPath)
else: #如果是一个文件,判断是否为目标文件
target = os.path.basename(path)
if target == name:
return path
return -1
path = g.enterbox(msg='请输入文件目录(如:D:DEV)')
name = g.enterbox(msg='请输入您要查找的文件名:')
answer = search(path,name)
if answer == -1:
g.msgbox("查无此文件",'查找错误')
else:
g.msgbox(answer,'返回路径')
3、运行结果
-
有此文件
-
无此文件
遇到问题及解决方法
- 编译错误:
解决方法:os.path.join() 的参数是 str 型, 添加代码root = str(root) dirs = str(dirs)
- 缩进错误:
解决方法:为了看看它能输出多少,我等待了五分钟,它还没有结束;结果把if name in dirs or name in files:
语句重新打了一遍就可以了,应该是缩进的错误 - 答案错误:把相同目录下的其他文件也输出出来了
解决方法:
os.walk() 的 dirs 参数 才是返回目录,将print(os.path.join(root, files))
改为print(os.path.join(root, dirs))
- 答案错误:输出的路径不是绝对路径
解决方法:将for root, dirs, files in os.walk('/'): # / 为根目录
改为for root, dirs, files in os.walk(path): # path 为根目录
心得体会
- 代码虽然很短,但是完成它的过程很不容易
- Python 中 循环和 if 分支后不用加大括号,但是需要
:
,而且缩进要十分注意 - Python 不用定义类型并不代表变量没有类型,使用变量前需要先赋值
- 序列包含 列表、元组和字符串
列表主要标志是[ ]
,是一个打了激素的数组,什么东西都能往里装
元组和字符串都是戴上了枷锁的列表;元组标志是( ) 和 ,
,其元素不可改变;字符串不能轻易修改
三者共同点:
1、都可以通过索引得到一个元素
2、默认索引值从零开始
3、可以通过分片的方式得到一个范围内元素的集合
4、有很多共同操作符(重复操作符、拼接操作符、成员关系操作符等) - Python 中有很多已经定义好的 BIF ,编写代码时很方便
- 经常会把输出 print() 打成 printf()