fileutils
-文件系统帮助器¶
几乎每个Python程序员都使用过Python来处理磁盘内容,并且 fileutils
收集标准库中一些最常见漏洞的解决方案。
创建、查找和复制¶
Python 的 os
, os.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 模式。- 参数:
例如,在当前目录中查找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 旗帜以达到同样的效果。- 参数:
有关更多详细信息,请查看
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 toFalse
(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.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个权限位;它不支持粘性位或更高级的权限系统。- 参数:
有很多种方法可以使用
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
物体。