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 和类似模块的各种功能,您很快就可以在这个小函数之上构建更复杂的操作。
在评论中写代码?请使用 ide.geeksforgeeks.org,生成链接并在此处分享链接。