fileutils -文件系统帮助器

几乎每个Python程序员都使用过Python来处理磁盘内容,并且 fileutils 收集标准库中一些最常见漏洞的解决方案。

创建、查找和复制

Python 的 osos.path ,及 shutil 模块很好地涵盖了文件争论的基本原理,这些函数帮助弥补了一些剩余的空白。

boltons.fileutils.mkdir_p(path)[源代码]

创建一个目录和在此过程中可能需要创建的任何父目录,而不会引发任何现有目录的错误。此函数模拟 mkdir -p 命令在Linux/BSD环境中可用,但也可在Windows上使用。

boltons.fileutils.iter_find_files(directory, patterns, ignored=None, include_dirs=False)[源代码]

返回一个生成器,该生成器在 directory ,匹配 patterns 使用 glob 语法(例如, *.txt )。还支持 ignored 模式。

参数:
  • directory (str) -- 作为搜索根的路径。生成的路径将包括此作为前缀。

  • patterns (str or list) -- 要在以下位置找到的单个图案或全局格式化图案列表 directory

  • ignored (str or list) -- 要忽略的单个图案或全局格式化图案列表。

  • include_dirs (bool) -- 是否也包括与模式匹配的目录。默认为 False

例如,在当前目录中查找Python文件:

>>> _CUR_DIR = os.path.dirname(os.path.abspath(__file__))
>>> filenames = sorted(iter_find_files(_CUR_DIR, '*.py'))
>>> os.path.basename(filenames[-1])
'urlutils.py'

或者,在忽略emacs锁定文件的情况下创建Python文件:

>>> filenames = iter_find_files(_CUR_DIR, '*.py', ignored='.#*')
boltons.fileutils.copytree(src, dst, symlinks=False, ignore=None)

这个 copy_tree 函数是内置的 shutil.copytree() ,但有一个关键区别:如果树的一部分已经存在,它不会引发异常。它通过使用 mkdir_p()

从Python3.8开始,您可以通过 shutil.copytree() 这个 dirs_exist_ok=True 旗帜以达到同样的效果。

参数:
  • src (str) -- 要复制的源目录的路径。

  • dst (str) -- 目标路径。已接受现有目录。

  • symlinks (bool) -- 如果 True ,复制符号链接而不是其内容。

  • ignore (callable) -- 接受路径和目录列表的Callable,返回列表中要忽略的文件。

有关更多详细信息,请查看 shutil.copytree()shutil.copy2()

原子文件保存

理想情况下,成功之路永远不应危及当前的进展。这就是为什么 atomic_save()AtomicSaver 是存在的。

使用与可写文件相同的API,所有输出都保存到临时文件中,当文件关闭时,旧文件在单个系统调用中被新文件替换,可在所有主要操作系统上移植。不再有部分写入或部分覆盖的文件。

boltons.fileutils.atomic_save(dest_path, **kwargs)[源代码]

一个方便的界面,可以访问 AtomicSaver 键入。示例:

>>> try:
...     with atomic_save("file.txt", text_mode=True) as fo:
...         _ = fo.write('bye')
...         1/0  # will error
...         fo.write('bye')
... except ZeroDivisionError:
...     pass  # at least our file.txt didn't get overwritten

请参阅 AtomicSaver 有关详细信息,请参阅文档。

class boltons.fileutils.AtomicSaver(dest_path, **kwargs)[源代码]

AtomicSaver 是可配置的 context manager 这提供了一个可写的 file 只要上下文管理器的块中没有引发异常,它就会被移到适当的位置。这些“部分文件”是在与目标路径相同的目录中创建的,以确保原子移动操作(即,不会发生跨文件系统移动)。

参数:
  • dest_path (str) -- 将写入完整文件的路径。

  • overwrite (bool) -- 如果目标文件在完成时存在,则是否覆盖该文件。默认为 True

  • file_perms (int) -- 新创建文件的文件权限的整数表示形式。默认情况下,当目标路径已经存在时,从上一个文件复制权限,或者如果文件不存在,则遵循用户的配置 umask ,通常会导致八进制0644或0664。

  • text_mode (bool) -- Whether to open the destination file in text mode (i.e., 'w' not 'wb'). Defaults to False (wb).

  • part_file (str) -- 临时人员的名称 part_file 。默认为 dest_path + .part 。请注意,此参数只是文件名,而不是零件文件的完整路径。为确保原子保存,始终在与目标路径相同的目录中创建零件文件。

  • overwrite_part (bool) -- 是否覆盖 part_file ,如果它在设置时存在。默认为 False ,这将导致一个 OSError 在预先存在的零件文件上引发。请注意,将此设置为 True 在多个线程或进程可能正在写入同一零件文件的情况下。

  • rm_part_on_exc (bool) -- 移除 part_file 在例外情况下。默认为 True ,但 False 在某些情况下可用于恢复。请注意,恢复不是自动的,默认情况下 OSError 如果 part_file 是存在的。

实际上,AericSaver有几个用途:

  • 避免用部分写入的文件覆盖现有的有效文件。

  • 合理保证零件文件一次只有一个编写器。

  • 故障情况下可选择恢复部分数据。

boltons.fileutils.atomic_rename(src, dst, overwrite=False)[源代码]

改名 srcdst ,替换 dst 如果*覆盖为True

boltons.fileutils.replace(src, dst)[源代码]

类似于 os.replace() 在Python3.3+中,此函数将自动创建或替换PATH中的文件 dst 文件位于PATH src

在Windows上,此函数使用ReplaceFileAPI在一系列文件系统上实现尽可能大的原子性。

文件权限

Linux、BSD、Mac OS和其他类Unix操作系统都共享一个简单的基本文件权限结构,该结构通常会导致意外的访问拒绝和文件泄漏。 FilePerms 是为了在使用来自Python代码的文件时提高清晰度并减少与权限相关的事故而构建的。

class boltons.fileutils.FilePerms(user='', group='', other='')[源代码]

这个 FilePerms 类型用于表示标准POSIX文件系统权限:

  • 朗读

  • 执行

在三类用户中:

  • 拥有(用户)服务

  • 所有者(G)群

  • 任何其他用户

此类帮助计算新权限以及使用数字八进制 777 -风格和 rwx -样式权限。目前它只考虑最低的9个权限位;它不支持粘性位或更高级的权限系统。

参数:
  • user (str) -- ‘rwx’格式的字符串,省略未提供拥有用户权限的字符。

  • group (str) -- ‘rwx’格式的字符串,省略未为其提供拥有组权限的字符。

  • other (str) -- ‘rwx’格式的字符串,省略未提供拥有其他/全局权限的字符。

有很多种方法可以使用 FilePerms

>>> FilePerms(user='rwx', group='xrw', other='wxr')  # note character order
FilePerms(user='rwx', group='rwx', other='rwx')
>>> int(FilePerms('r', 'r', ''))
288
>>> oct(288)[-3:]  # XXX Py3k
'440'

另请参阅 FilePerms.from_int()FilePerms.from_path() 类方法,找到有用的替代方法来构造 FilePerms 物体。

杂类

class boltons.fileutils.DummyFile(path, mode='r', buffering=None)[源代码]