📜  Python|创建档案并按名称查找文件

📅  最后修改于: 2022-05-13 01:55:30.364000             🧑  作者: Mango

Python|创建档案并按名称查找文件

在本文中,我们将学习如何使用 shutil 模块创建或解压常见格式(例如,.tar、.tgz 或 .zip)的档案。

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有其他库模块用于处理各种归档格式(例如,tarfile、zipfile、gzip、bz2 等)的低级细节。然而,要制作或提取档案,真的没有必要走这么低的水平。
可以直接在shutil 中使用这些高级函数。这些函数具有用于日志记录、试运行、文件权限等的各种附加选项。让我们编写一个涉及查找文件的脚本,例如文件重命名脚本或日志归档实用程序,但不必从Python脚本中调用 shell 实用程序,或者提供通过“shelling out”不容易获得的特殊行为。

要搜索文件,请使用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()方法为我们遍历目录层次结构,对于它进入的每个目录,它返回一个 3 元组,包含它正在检查的目录的相对路径,一个包含该目录中所有目录名称的列表,以及该目录中的文件名列表。
  • 对于每个元组,只需检查目标文件名是否在文件列表中。如果是,则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 和类似模块的各种功能,您很快就可以在这个小函数之上构建更复杂的操作。