Python 根据名称创建存档和查找文件

Python 根据名称创建存档和查找文件

在本文中,我们将学习如何创建或解压缩通用格式的存档(e.g。, .tar, .tgz或.zip)使用shutil模块。

shutil模块有两个函数——make_archive()和unpack_archive()——它们正好可以作为解决方案。

示例1

import shutil
shutil.unpack_archive('Python-3.3.0.tgz')
shutil.make_archive('py33', 'zip', 'Python-3.3.0')

输出:

'/Users/Dell/Downloads/py33.zip'

make_archive()的第二个参数是所需的输出格式。要获取支持的存档格式列表,请使用get_archive_formats()。

示例2

shutil.get_archive_formats()

输出:

[('bztar', "bzip2'ed tar-file"), 
 ('gztar', "gzip'ed tar-file"), 
 ('tar', 'uncompressed tar file'), 
 ('zip', 'ZIP file')]

Python还有其他库模块用于处理各种存档格式的底层细节(e.g。、tarfile、zipfile、gzip、bz2等)。然而,要创建或提取存档,实际上没有必要进行如此低级的操作。
我们可以在shutil中使用这些高级函数。这些函数具有各种附加选项,用于日志记录、运行、文件权限等。

让我们编写一个包含查找文件的脚本,比如文件重命名脚本或日志归档实用程序,但是不需要从Python脚本中调用shell实用程序,或者提供不容易通过“炮轰”获得的特殊行为。

要搜索文件,使用os.walk()函数,为其提供顶级目录。

示例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])

将这个脚本保存为abc.py,并从命令行运行它,输入起始点和名称作为位置参数-

bash % ./abc.py .myfile.txt

它是如何工作的?

  • os.walk()方法为我们遍历目录层次结构,对于它进入的每个目录,它都返回一个三元组,其中包含它所检查的目录的相对路径,一个列表包含该目录中的所有目录名,以及该目录中的文件名列表。
  • 对于每个元组,只需检查目标文件名是否在文件列表中。如果是,则使用os.path.join()来组合路径。
  • 为了避免出现像./这样奇怪的路径。/foo//bar,两个附加的函数用于修复结果。
  • 第一个是os.path.abspath(),它采用的路径可能是相对的,并形成绝对路径。
  • 第二个是os.path.normpath(),它将对路径进行规范化,从而解决双斜杠、对当前目录的多个引用等问题。

尽管与UNIX平台上的find实用程序的特性相比,该代码非常简单,但它具有跨平台的优点。此外,可以以一种可移植的方式添加许多额外的功能,而不需要做太多的工作。

示例4

输出最近修改时间的所有文件的函数

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]))

使用os、os.path、glob和类似模块的各种特性,在这个小函数上构建复杂得多的操作并不需要很长时间。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python 示例