Python练习:分析目录中所有的文件

题目

请求写一个函数,这个函数的参数是一个本地目录。

要求该函数分析目录中所有的扩展名为md文件(包括子目录、子目录的子目录等等 里面的md文件),将文件内容中的图片链接里面的所有png格式的图片下载到当前工作目录中。

也就是,遇到md文件里面的这样格式的字符串

https://res.cloudinary.com/fengerzh/image/upload/jenkins-docker_ykt9g3.png

就将其 下载下来。

大家可以下载这里的zip文件, 解压得到的目录作为 函数的参数目录



答案与解析

















































答案

这个题目考察的重点是3个:

  • 如何递归的访问目录下面 包含的所有文件
  • 如何使用正则表达式得到目标字符串
  • 如何HTTP下载网络文件 (访问这里下载windows上的 wget https://eternallybored.org/misc/wget/1.19.4/32/wget.exe)
import os
import re

def fetchPhotos(srcDir,downloadDir):


    # 找出所有的md文件,路径放入列表 mdFiles中

    mdFiles = []

    # os.walk 会递归遍历目录下所有的子目录
    # 每次遍历的对象都是返回的是一个三元组(root,dirs,files)
    #
    # root 所指的是当前正在遍历的这个文件夹的本身的地址
    # dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    # files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
    for root, dirs, files in os.walk(srcDir):

        # 只需要关心当前目录下面的md文件
        for file in files:
            if not file.endswith('.md'):
                continue

            filepath = os.path.join(root,file)
            mdFiles.append(filepath)


    # mdFiles中分析所有文件的内容,找出所有png图片链接,放入photoLinks
    photoLinks = []
    for mdFile in mdFiles:
        print(mdFile)

        with open(mdFile,encoding='utf8') as f:
            lines = f.readlines()
            for line in lines:
                # 正则表达式查找所有以 https://开头, 以.png 结尾的 模式字符串
                links = re.findall("https://.*\.png", line)
                photoLinks += links


    # 下载 photoLinks中 所有图片链接
    for link  in photoLinks:
        print(link)
        # 使用外部wget程序下载图片
        # -q quiet
        # -P 指定下载保存目录
        # -N 只下载有更新的
        os.system(f'wget.exe -o -N -P {downloadDir}  {link}')


fetchPhotos(r'e:\tmp\fengerzh.github.io-master', r'e:\tmp\down')