文章目录
- os.symlink(src, dst, target_is_directory=False, *, dir_fd=None)
- os.sync()
- os.truncate(path, length)
- os.unlink(path, *, dir_fd=None)
- os.utime(path, times=None, *, [ns, ]dir_fd=None, follow_symlinks=True)
- os.walk(top, topdown=True, οnerrοr=None, followlinks=False)
- os.memfd_create(name[, flags=os.MFD_CLOEXEC])
- os.eventfd(initval[, flags=os.EFD_CLOEXEC])
- os.eventfd_read(fd)
os.symlink(src, dst, target_is_directory=False, *, dir_fd=None)
os.symlink() 是 Python 的 os 模块中用于创建符号链接(也称为软链接)的函数。这个函数接受至少两个参数:src 和 dst,分别表示要链接的源文件或目录的路径和符号链接的路径。
参数说明如下:
- src:要链接的源文件或目录的路径(必需参数)。
- dst:符号链接的路径(必需参数)。
- target_is_directory:一个布尔值,指定 src 是否是一个目录。在 Python 3.6 之前的版本中,这个参数是可选的,但在 3.6 及以后的版本中,它被移除,并添加了 dir_fd 参数。
- dir_fd:一个可选参数,用于指定目录描述符,该描述符用于解释 dst 参数中的相对路径。如果 dir_fd 不是 None,则 dst 路径是相对于该描述符所指向的目录的。
在 Python 3.6 及以后的版本中,如果你想要创建一个指向目录的符号链接,你不再需要使用 target_is_directory 参数。相反,你应该确保 dst 参数以斜杠(/)结尾,以表明它是一个目录。
下面是一个使用 os.symlink() 的示例:
import os
# 创建一个指向文件的符号链接
os.symlink('source.txt', 'link_to_source.txt')
# 创建一个指向目录的符号链接
os.symlink('sourcedir/', 'link_to_sourcedir/')
在这个例子中,source.txt 是一个文件的路径,而 sourcedir/ 是一个目录的路径。link_to_source.txt 和 link_to_sourcedir/ 分别是创建的符号链接的路径。
注意:创建符号链接可能需要相应的文件系统权限,并且在某些文件系统或操作系统上可能不支持符号链接。在尝试创建符号链接之前,最好检查当前环境是否支持此功能。
os.sync()
os.sync() 是 Python 的 os 模块中的一个函数,用于将所有挂起的文件系统写入操作(例如,由于缓存而未实际写入磁盘的操作)强制推送到磁盘。这可以确保数据的持久性和一致性。
当你修改文件或文件系统时,操作系统通常不会立即将这些更改写入磁盘,而是先将它们保存在内存中,等待适当的时机再写入。这可以提高性能,因为磁盘写入通常比内存操作慢得多。但是,这也意味着在系统崩溃或突然断电的情况下,可能会丢失未写入磁盘的数据。
os.sync() 函数提供了一种确保数据实际写入磁盘的方法。它会阻塞调用线程,直到所有挂起的文件系统写入操作都完成。
这里是一个简单的示例,展示了如何使用 os.sync():
import os
# 写入一些数据到文件
with open('example.txt', 'w') as f:
f.write('Hello, world!')
# 确保数据被写入磁盘
os.sync()
# 在此点之后,文件数据应该已经安全地写入磁盘
需要注意的是,os.sync() 只影响文件系统级别的挂起写入。它不会确保其他进程或线程的数据也被写入磁盘。此外,os.sync() 只影响调用它的进程的文件系统操作;它不会等待其他进程完成它们的文件系统写入。
在大多数情况下,你不需要手动调用 os.sync(),因为 Python 和操作系统会自动处理数据的写入和持久化。然而,在某些特殊情况下,例如当需要确保数据一致性或在创建系统快照之前,手动调用 os.sync() 可能是有用的。
os.truncate(path, length)
os.truncate() 是 Python 的 os 模块中的一个函数,用于调整已存在文件的大小。如果文件是文本文件,它会在文件当前大小的基础上截断或扩展文件,以便它包含指定数量的字节。如果文件是二进制文件,则结果可能因平台而异,因为二进制文件的解释可能涉及文件系统的块大小和其他因素。
这个函数接受两个参数:
- path:要调整大小的文件的路径(字符串类型)。
- length:新的文件大小(以字节为单位)。
当 length 大于文件当前大小时,文件会被扩展,并且扩展部分的内容通常是未定义的(即,读取这些部分可能会返回任何值)。当 length 小于文件当前大小时,文件会被截断,导致丢失从该点到文件末尾的所有数据。
请注意,如果 path 指向的是一个符号链接,那么 os.truncate() 会更改符号链接指向的实际文件的大小,而不是符号链接本身的大小。
此外,调用 os.truncate() 需要对文件具有写权限,并且如果文件被其他进程打开并且锁定了某些部分,则可能无法成功截断文件。
下面是一个使用 os.truncate() 的简单示例:
import os
# 打开一个文件并写入一些数据
with open('example.txt', 'w') as f:
f.write('Hello, world!')
# 获取文件当前大小
file_size = os.path.getsize('example.txt')
print(f'Current file size: {file_size} bytes')
# 截断文件,将其大小设置为5字节
os.truncate('example.txt', 5)
# 再次获取文件大小以确认更改
file_size = os.path.getsize('example.txt')
print(f'New file size after truncation: {file_size} bytes')
# 读取截断后的文件内容
with open('example.txt', 'r') as f:
print(f'File content after truncation: {f.read()}')
在这个例子中,example.txt 文件最初被写入 “Hello, world!”,然后被截断为5字节。因此,最终的文件内容将只包含 “Hello”。
os.unlink(path, *, dir_fd=None)
os.unlink() 是 Python 的 os 模块中的一个函数,用于删除一个文件。这个函数接受一个参数 path,它指定了要删除文件的路径。
参数说明如下:
- path:要删除文件的路径(必需参数)。
- dir_fd:一个可选参数,用于指定目录描述符。如果提供了 dir_fd,则 path 应该是相对于该目录描述符的相对路径。
当调用 os.unlink() 时,指定的文件将从文件系统中删除。如果文件不存在,则通常会抛出一个 FileNotFoundError 异常。
请注意,删除文件是一个不可逆的操作,一旦文件被删除,它就不能被恢复(除非使用了特定的数据恢复工具或方法)。因此,在调用 os.unlink() 之前,请确保你真的想要删除该文件,并且已经做好了备份(如果需要的话)。
下面是一个使用 os.unlink() 的示例:
import os
# 删除一个文件
try:
os.unlink('example.txt')
print("File has been deleted successfully.")
except FileNotFoundError:
print("File does not exist.")
在这个例子中,我们尝试删除名为 example.txt 的文件。如果文件成功删除,我们打印一条消息确认删除操作。如果文件不存在,我们捕获 FileNotFoundError 异常并打印相应的消息。
dir_fd 参数可以用于在具有打开目录描述符的情况下删除文件。这在某些高级用法中可能是有用的,但在大多数情况下,你可能不需要使用它。如果你只是要删除一个文件,只提供 path 参数就足够了。
os.utime(path, times=None, *, [ns, ]dir_fd=None, follow_symlinks=True)
os.utime() 是 Python 的 os 模块中的一个函数,用于更改文件的访问和修改时间。这个函数对于管理文件的元数据(metadata)非常有用,比如当你需要更新文件的最后访问时间或最后修改时间时。
os.utime() 的参数如下:
- path:要更改时间的文件的路径(字符串类型)。
- times:一个包含两个时间戳的元组 (atime, mtime),分别代表访问时间和修改时间。时间戳通常是以秒为单位的浮点数,表示自纪元(Epoch,通常是 1970 年 1 月 1 日 00:00:00 UTC)以来的秒数。如果 times 是 None,则只会更新文件的修改时间,并且访问时间会被设置为修改时间。
- ns:一个可选参数,只在 Python 3.9 及更高版本中可用。它是一个包含两个时间戳的元组 (atime_ns, mtime_ns),分别代表访问时间和修改时间的纳秒级精度。这些时间戳是以纳秒为单位的整数。如果提供了 ns 参数,它将优先于 times 参数。
- dir_fd:一个可选参数,用于指定目录描述符。如果提供了 dir_fd,则 path 应该是相对于该目录描述符的相对路径。
- follow_symlinks:一个布尔值,默认为 True。如果为 True,并且 path 是一个符号链接,则 os.utime() 会更改符号链接指向的实际文件的时间戳。如果为 False,则 os.utime() 会更改符号链接本身的时间戳,而不是它所指向的文件。
下面是一个使用 os.utime() 的简单示例:
import os
import time
# 获取当前时间戳
now = time.time()
# 更改文件的访问和修改时间为当前时间
os.utime('example.txt', times=(now, now))
# 或者使用纳秒级精度
now_ns = int(time.time() * 1e9)
os.utime('example.txt', ns=(now_ns, now_ns))
# 如果文件是一个符号链接,并且 follow_symlinks 为 False,则更改符号链接的时间戳
os.utime('symlink_to_example.txt', times=(now, now), follow_symlinks=False)
在这个例子中,我们首先获取了当前的时间戳,然后使用 os.utime() 将 example.txt 文件的访问时间和修改时间都设置为当前时间。接下来,我们使用了纳秒级精度的时间戳来执行相同的操作。最后,我们展示了如何更改一个符号链接的时间戳,而不是它所指向的文件的时间戳。
os.walk(top, topdown=True, οnerrοr=None, followlinks=False)
os.walk() 是 Python 的 os 模块中的一个函数,用于通过目录树生成文件名,通过在目录树中游走来实现这一点。它返回一个生成器,每次迭代时产生一个三元组 (dirpath, dirnames, filenames),其中:
- dirpath 是一个字符串,表示目录的路径。
- dirnames 是一个列表,包含 dirpath 中的目录名(不包括 ‘.’ 和 ‘…’,以及任何在 os.scandir() 调用中由于权限问题而不可见的名称)。
- filenames 是一个列表,包含 dirpath 中的非目录子项的名称。
os.walk() 的参数包括:
- top:需要遍历的目录路径的字符串。
- topdown:一个布尔值,默认为 True。如果为 True,则首先列出 top 目录,然后列出其下的子目录。如果为 False,则首先列出最底层的子目录,然后逐渐向上列出父目录。
- onerror:一个可选的错误处理函数,默认为 None。当 os.walk() 遇到错误时(例如权限问题),如果 onerror 不是 None,则调用它,并传递一个参数,即引发的异常。如果 onerror 是 None,则异常会被忽略。
- followlinks:一个布尔值,默认为 False。如果为 True,则通过符号链接访问目录。
以下是一个使用 os.walk() 的简单示例:
import os
# 遍历指定目录及其子目录
for dirpath, dirnames, filenames in os.walk('/path/to/directory'):
# 打印当前目录的路径
print(f"Visiting directory: {dirpath}")
# 遍历当前目录下的所有文件和子目录
for filename in filenames:
# 打印文件的完整路径
print(f"File: {os.path.join(dirpath, filename)}")
# 遍历当前目录下的所有子目录
for dirname in dirnames:
# 打印子目录的完整路径
print(f"Subdirectory: {os.path.join(dirpath, dirname)}")
# 注意:这个循环会一直执行,直到遍历完整个目录树。
# 如果你只想遍历到某个深度,你需要添加适当的逻辑来退出循环。
在这个例子中,我们遍历了 /path/to/directory 及其所有子目录,并打印了每个文件和子目录的完整路径。os.path.join(dirpath, filename) 和 os.path.join(dirpath, dirname) 用于构建文件和子目录的完整路径。
os.memfd_create(name[, flags=os.MFD_CLOEXEC])
os.memfd_create() 是 Python 3.8 版本中新增的一个函数,它用于创建一个内存中的文件描述符,而不是在磁盘上创建实际的文件。这个函数是 os.memfd() 在 Linux 系统上的一个别名,用于在进程内创建一个临时的、匿名的、可读写的内存文件。这对于在内存中快速创建和处理文件内容,而不涉及实际的磁盘 I/O,非常有用。
参数说明如下:
-
name:一个可选的字符串参数,用于给内存文件描述符指定一个名称。这个名称主要是用于调试和日志记录,并不会影响文件描述符的行为或可见性。如果提供了名称,它必须是唯一的,否则会抛出一个 FileExistsError 异常。如果省略了 name 参数或将其设置为 None,则内存文件描述符将没有名称。
-
flags:一个可选的整数参数,用于指定文件描述符的行为。这个参数通常与标准文件打开模式标志(如 os.O_RDONLY、os.O_WRONLY、os.O_RDWR 等)一起使用,并且可以组合使用。一个常见的标志是 os.MFD_CLOEXEC,它表示在创建新的进程时,这个内存文件描述符将被自动关闭。如果省略了 flags 参数,则默认值为 0。
下面是一个使用 os.memfd_create() 的示例:
import os
# 创建一个内存文件描述符
fd = os.memfd_create('my_memory_file')
# 使用文件描述符进行读写操作
try:
# 写入数据
os.write(fd, b'Hello, world!')
# 读取数据
data = os.read(fd, os.lseek(fd, 0, os.SEEK_END))
print(data.decode()) # 输出: Hello, world!
finally:
# 关闭文件描述符
os.close(fd)
在这个例子中,我们首先使用 os.memfd_create() 创建了一个名为 my_memory_file 的内存文件描述符。然后,我们使用 os.write() 将一些数据写入这个文件描述符,并使用 os.read() 读取它。最后,我们使用 os.close() 关闭文件描述符。
请注意,由于内存文件描述符是存储在内存中的,因此它们不受文件系统配额的限制,并且不会占用磁盘空间。然而,它们仍然受到可用内存的限制,并且在进程结束时会自动释放。
os.eventfd(initval[, flags=os.EFD_CLOEXEC])
os.eventfd() 是 Python 3.3 版本中新增的一个函数,它用于在进程内创建一个事件文件描述符。事件文件描述符是一个特殊的文件描述符,它可以通过写入数据来设置或清除事件,并通过读取数据来检查事件是否被设置。这对于进程间通信(IPC)以及线程间同步非常有用。
参数说明如下:
-
initval:一个非负整数,表示事件文件描述符的初始值。这个值通常用于表示事件的状态。当 initval 非零时,事件被认为是“设置”的;当 initval 为零时,事件被认为是“清除”的。
-
flags:一个可选的整数参数,用于指定文件描述符的行为。常见的标志是 os.EFD_CLOEXEC,它表示在创建新的进程时,这个事件文件描述符将被自动关闭。如果省略了 Flags 参数,则默认值为 0。
下面是一个使用 os.eventfd() 的简单示例:
import os
import time
# 创建一个初始值为 1 的事件文件描述符
eventfd = os.eventfd(1)
# 读取事件文件描述符的值,应该返回 1,表示事件是设置的
value = os.read(eventfd, 8)
print(f"Initial event value: {value}") # 输出: Initial event value: b'\x01\x00\x00\x00\x00\x00\x00\x00'
# 等待一段时间,模拟其他进程或线程可能改变事件状态的情况
time.sleep(1)
# 再次读取事件文件描述符的值
value = os.read(eventfd, 8)
print(f"Event value after sleep: {value}") # 输出: Event value after sleep: b'\x01\x00\x00\x00\x00\x00\x00\x00'
# 清除事件(将值写为 0)
os.write(eventfd, b'\x00' * 8)
# 再次读取事件文件描述符的值,应该返回 0,表示事件被清除了
value = os.read(eventfd, 8)
print(f"Event value after clearing: {value}") # 输出: Event value after clearing: b'\x00\x00\x00\x00\x00\x00\x00\x00'
# 关闭事件文件描述符
os.close(eventfd)
在这个例子中,我们首先创建了一个初始值为 1 的事件文件描述符,这意味着事件一开始是设置的。然后我们通过读取文件描述符的值来检查事件的状态。在等待一段时间后,我们再次读取值,发现它仍然是 1,因为没有其他进程或线程更改它。接着,我们通过写入一个全零字节串来清除事件,并再次读取值来确认事件已被清除。
请注意,事件文件描述符的值是以字节数组的形式读写的,通常是一个 8 字节的数组,以支持 64 位的事件值。在上面的例子中,我们使用了 b’\x01\x00\x00\x00\x00\x00\x00\x00’ 和 b’\x00\x00\x00\x00\x00\x00\x00\x00’ 来表示 1 和 0 的值。
os.eventfd_read(fd)
os.eventfd_read(fd, size) 是 Python 中的一个函数,用于从事件文件描述符(eventfd)中读取事件值。事件文件描述符是通过 os.eventfd() 函数创建的,用于进程间通信或线程间同步。
函数参数:
- fd: 事件文件描述符的整数文件描述符。
- size: 可选参数,指定要读取的字节数。如果省略,则默认读取整个事件值(通常是 8 字节)。
函数返回值:
- 返回一个整数,表示事件文件描述符的当前值。
os.eventfd_read() 函数从事件文件描述符中读取事件值,并返回它。事件值通常用于表示事件的状态或条件。读取操作会同时减少事件文件描述符的值。如果事件值为零,则读取操作将阻塞,直到事件值变为非零。
下面是一个使用 os.eventfd_read() 的简单示例:
import os
# 创建一个初始值为 1 的事件文件描述符
eventfd = os.eventfd(1)
# 读取事件文件描述符的值
event_value = os.eventfd_read(eventfd, 8)
print(f"Initial event value: {event_value}") # 输出: Initial event value: 1
# 再次读取事件文件描述符的值,应该还是 1
event_value = os.eventfd_read(eventfd, 8)
print(f"Event value after first read: {event_value}") # 输出: Event value after first read: 1
# 写入一个值来更新事件文件描述符
os.write(eventfd, b'\x01\x00\x00\x00\x00\x00\x00\x00')
# 再次读取事件文件描述符的值,应该更新为 2
event_value = os.eventfd_read(eventfd, 8)
print(f"Event value after writing 1: {event_value}") # 输出: Event value after writing 1: 2
# 关闭事件文件描述符
os.close(eventfd)
在这个例子中,我们首先创建了一个初始值为 1 的事件文件描述符。然后,我们连续两次读取事件值,都得到 1,因为事件值在两次读取之间没有被改变。接着,我们通过写入一个值来增加事件文件描述符的值,并再次读取,得到更新后的值 2。最后,我们关闭了事件文件描述符。
请注意,os.eventfd_read() 函数可能会阻塞,如果事件值为零且没有设置 O_NONBLOCK 标志,则调用将等待直到事件值变为非零。如果需要非阻塞行为,可以在打开文件描述符时设置 O_NONBLOCK 标志,或者在调用 os.eventfd_read() 之前使用 fcntl 模块来设置它。
本文介绍了Python os模块的多个函数,如os.symlink用于创建符号链接,os.sync确保数据写入磁盘,os.truncate调整文件大小,os.unlink删除文件等。详细说明了各函数的参数及使用方法,并给出示例,还提及使用时的注意事项。
&spm=1001.2101.3001.5002&articleId=137409696&d=1&t=3&u=701d5540212b4f1c893b779f35b1b2ab)
532

被折叠的 条评论
为什么被折叠?



