Weibw's World Weibw's World
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Weibw

一个没有梦想的咸鱼
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《Flask》

  • 《Python Cookbook》第三版

    • 第一章:数据结构与算法

    • 第二章:字符串和文本

    • 第三章:数字日期和时间

    • 第四章:迭代器与生成器

    • 第五章:文件与IO

    • 第六章:数据编码和处理

    • 第七章:函数

    • 第八章:类与对象

    • 第九章:元编程

    • 第十章:模块与包

    • 第十一章:网络与Web编程

    • 第十二章:并发编程

    • 第十三章:脚本编程与系统管理

      • 通过重定向-管道-文件接受输入
      • 终止程序并给出错误信息
      • 解析命令行选项
      • 运行时弹出密码输入提示
      • 获取终端的大小
      • 执行外部命令并获取它的输出
      • 复制或者移动文件和目录
      • 创建和解压归档文件
      • 通过文件名查找文件
        • 问题
        • 解决方案
        • 讨论
      • 读取配置文件
      • 给简单脚本增加日志功能
      • 给函数库增加日志功能
      • 实现一个计时器
      • 限制内存和CPU的使用量
      • 启动一个WEB浏览器
    • 第十四章:测试、调试和异常

    • 第十五章:C语言扩展

  • Python基础

  • Python
  • 《Python Cookbook》第三版
  • 第十三章:脚本编程与系统管理
weibw
2022-01-18

通过文件名查找文件

# 问题

你需要写一个涉及到文件查找操作的脚本,比如对日志归档文件的重命名工具, 你不想在Python脚本中调用shell,或者你要实现一些shell不能做的功能。

# 解决方案

查找文件,可使用 os.walk() 函数,传一个顶级目录名给它。 下面是一个例子,查找特定的文件名并答应所有符合条件的文件全路径:

#!/usr/bin/env python3.3
import os

def findfile(start, name):
    for relpath, dirs, files in os.walk(start):
        if name in files:
            full_path = os.path.join(start, relpath, name)
            print(os.path.normpath(os.path.abspath(full_path)))

if __name__ == '__main__':
    findfile(sys.argv[1], sys.argv[2])
1
2
3
4
5
6
7
8
9
10
11

保存脚本为文件findfile.py,然后在命令行中执行它。 指定初始查找目录以及名字作为位置参数,如下:

# 讨论

os.walk() 方法为我们遍历目录树, 每次进入一个目录,它会返回一个三元组,包含相对于查找目录的相对路径,一个该目录下的目录名列表, 以及那个目录下面的文件名列表。

对于每个元组,只需检测一下目标文件名是否在文件列表中。如果是就使用 os.path.join() 合并路径。 为了避免奇怪的路径名比如 ././foo//bar ,使用了另外两个函数来修正结果。 第一个是 os.path.abspath() ,它接受一个路径,可能是相对路径,最后返回绝对路径。 第二个是 os.path.normpath() ,用来返回正常路径,可以解决双斜杆、对目录的多重引用的问题等。

尽管这个脚本相对于UNIX平台上面的很多查找来讲要简单很多,它还有跨平台的优势。 并且,还能很轻松的加入其他的功能。 我们再演示一个例子,下面的函数打印所有最近被修改过的文件:

#!/usr/bin/env python3.3

import os
import time

def modified_within(top, seconds):
    now = time.time()
    for path, dirs, files in os.walk(top):
        for name in files:
            fullpath = os.path.join(path, name)
            if os.path.exists(fullpath):
                mtime = os.path.getmtime(fullpath)
                if mtime > (now - seconds):
                    print(fullpath)

if __name__ == '__main__':
    import sys
    if len(sys.argv) != 3:
        print('Usage: {} dir seconds'.format(sys.argv[0]))
        raise SystemExit(1)

    modified_within(sys.argv[1], float(sys.argv[2]))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

在此函数的基础之上,使用os,os.path,glob等类似模块,你就能实现更加复杂的操作了。 可参考5.11小节和5.13小节等相关章节。

编辑 (opens new window)
上次更新: 2023/10/13, 17:39:25
创建和解压归档文件
读取配置文件

← 创建和解压归档文件 读取配置文件→

最近更新
01
牛客网非技术快速入门SQL练习题
03-08
02
其他日常SQL题
03-07
03
用户与权限管理
03-05
更多文章>
Theme by Vdoing | Copyright © 2021-2023 | Weibw | 辽ICP备18015889号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式