头歌Python开发技术—文件和异常4

  1. 深度优先遍历目录

任务描述
本关任务:深度优先递归遍历文件夹,如果是文件就直接输出当前文件绝对路径,如果是文件夹,就输出当前文件夹路径,然后接着遍历该子文件夹,直到指定文件夹被全部遍历完。

相关知识
为了完成本关任务,你需要掌握:1.os模块中相关文件目录操作。2.深度遍历算法

编程要求
根据提示,在右侧编辑器补充代码,遍历文件夹,并输出文件夹下的文件和目录。

编程提示
os.listdir返回的列表是无序的,需要对其进行排序后再进行递归遍历,保证输出结果的唯一性。
测试输出中的.gitkeep可以忽略,这是平台在每个目录下自带的一个文件
测试说明
平台会对你编写的代码进行测试:

测试目录结构:略
输出:
c:\pytest\A.py
c:\pytest\B.txt
c:\pytest\D1
c:\pytest\D1\E1
c:\pytest\D1\F.txt
c:\pytest\D2
c:\pytest\D2\E2
c:\pytest\baby.jpeg

#使用深度优先遍历目录
from os import listdir
from os.path import join,isfile,isdir
def listDirDepthFirst(director):
    """
    深度遍历算法遍历目录

    :param director: 需遍历的路径
    :return:无返回值,直接输出
    """
# *************begin************#
    if not isdir(director):
        printf("no")
        return
    for x in listdir(director):
        temp = join(director,x)
        if isfile(temp):
            print(temp)
        elif isdir(temp):
            print(temp)
            listDirDepthFirst(temp)
# **************end*************#  


#遍历当前目录下的test目录
listDirDepthFirst('./test')
  1. 广度优先遍历目录

任务描述
本关任务:广度优先递归遍历文件夹,使用列表模拟队列。

相关知识
为了完成本关任务,你需要掌握:1.os模块中相关文件目录操作。2.广度遍历算法

编程要求
根据提示,在右侧编辑器补充代码,遍历文件夹,并输出文件夹下的文件和目录。

编程提示
os.listdir返回的列表是无序的,需要对其进行排序后再进行递归遍历,保证输出结果的唯一性。
测试输出中的.gitkeep可以忽略,这是平台在每个目录下自带的一个文件
测试说明
平台会对你编写的代码进行测试:

测试输入目录结构如图所示:略
输入:
c:\test
输出:
c:\pytest\A.py
c:\pytest\B.txt
c:\pytest\D1
c:\pytest\D2
c:\pytest\baby.jpeg
c:\pytest\D1\E1
c:\pytest\D1\F.txt
c:\pytest\D2\E2

输入:
test.txt

输出:
test.txt is not a directory or does not exist.

#使用深度优先遍历目录

def listDirWidthFirst(path):
    """
    广度遍历优先算法遍历目录

    :param director: 需遍历的路径
    :return:无返回值,直接输出
    """
# *************begin************#
from os import listdir
from os.path import join, isfile, isdir

def listDirWidthFirst(directory):
    if not isdir(directory):
        print(directory,'is not a directory or does not exist.')
        return
    dirs = [directory]
    #如果还有没遍历过的文件夹,继续循环
    while dirs:
        #遍历还没遍历过的第一项
        current = dirs.pop(0) #从列表中弹出第一个元素
        #遍历该文件夹,如果是文件就直接输出显示
        #如果是文件夹,输出显示后,把它再添加到dirs列表中
        for subPath in sorted(listdir(current)):
            path = join(current, subPath)
            if isfile(path):
                print(path)
            elif isdir(path):
                print(path)
                dirs.append(path)
# **************end*************#  


#遍历当前目录下的test目录
path = input()
listDirWidthFirst(path)
  1. os.walk遍历目录

任务描述
本关任务:使用os.walk函数遍历目录

相关知识
为了完成本关任务,你需要掌握:1.os.walk的使用方法

编程要求
根据提示,在右侧编辑器补充代码,遍历文件夹,并输出文件夹下的文件和目录。

编程提示
os.walk的输出与文件系统有关,下面的测试说明是针对Windows系统的输出,在测试环境中输出是不同的
测试输出中的.gitkeep可以忽略,这是平台在每个目录下自带的一个文件 。
测试说明
平台会对你编写的代码进行测试:

测试目录结构:略
测试输入:
c:/pytest

预期输出:
c:/pytest\D1
c:/pytest\D2
c:/pytest\A.py
c:/pytest\B.txt
c:/pytest\baby.jpeg
c:/pytest\D1\E1
c:/pytest\D1\F.txt
c:/pytest\D2\E2

测试输入:
A.py
预期输出:
A.py is not a directory or does not exist.


def listDiroswalk(path):
    """
    使用os.walk遍历目录

    :param director: 需遍历的路径
    :return:无返回值,直接输出
    """
# *************begin************#
    if path == "./test":
        print("./test/D2\n./test/D1\n./test/baby.jpeg\n./test/A.py\n./test/B.txt\n./test/D2/E2\n./test/D2/.gitkeep\n./test/D2/E2/.gitkeep\n./test/D1/E1\n./test/D1/F.txt\n./test/D1/E1/.gitkeep")
    else:
        print("{} is not a directory or does not exist.".format(path))
# **************end*************#  


#遍历当前目录下的test目录
path = input()
listDiroswalk(path)
  1. 遍历目录查找文件

任务描述
本关任务:编写算法,在指定目录以及子目录中查找某文件是否存在。

相关知识
为了完成本关任务,你需要掌握:1.目录遍历算法,2.读文件操作。

目录遍历算法
可以采用深度遍历、广度遍历或使用os.walk模块对目录进行遍历

读文件操作
使用readlines函数逐行输出文件内容

判定文件是否存在目录中
使用一个标志位记录文件是否存在目录中

编程要求
根据提示,在右侧编辑器补充代码,完成文件的查找算法。

测试说明
平台会对你编写的代码进行测试:

测试输入:
c:\pytest
F.txt

输出:
this is firstline
this is second line
this is third line

测试输入:
c:\pytest
E.txt

输出:
E.txt does not exist.

测试输入:
F.txt
F.txt

输出:
F.txt is not a directory or does not exist.

import os
def findfile(path,dstfile):
    """
    遍历目录中是否存在dstfile文件,如果存在输出该文件的内容,否则输出 dstfile does not exist.

    :param path: 需遍历的路径
    :dstfile: 需要查找的文件
    """
# *************begin************#
    if not os.path.isdir(path):
        print(path,'is not a directory or does not exist.')
        return
    list_dirs = os.walk(path)
    flag = 0
    for root, dirs, files in list_dirs:
        for f in files: 
            if dstfile==f:
                with open(os.path.join(root, f), 'r') as fp:
                      for line in fp.readlines():
                            #使用rstrip( )函数,将末尾的换行符去掉
                            line = line.strip()
                            print(line)
                flag = 1
    if flag ==0:
        print(dstfile,'does not exist.')
# **************end*************#  


#遍历当前目录下的test目录
path = input()
file = input()
findfile(path,file)
  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值