Python | os.sendfile 函数

Lasted 2020-12-16 14:17:37

os.sendfile 函数将文件描述符 in_fd 中的 count 字节复制到文件描述符 out_fd 的偏移位置 offset 处。返回复制的字节数,如果到达 EOF,返回 0。

支持将套接字作为 out_fd 文件描述符。Mac OS X 和 FreeBSD 系统中可以使用 headers 等参数。

函数定义

os.sendfile(out_fd, in_fd, offset, count)
# 函数定义

if sys.platform != 'win32':
    # Unix only
    ...
    @overload
    def sendfile(__out_fd: int, __in_fd: int, offset: Optional[int], count: int) -> int: ...
    @overload
    def sendfile(
        __out_fd: int,
        __in_fd: int,
        offset: int,
        count: int,
        headers: Sequence[bytes] = ...,
        trailers: Sequence[bytes] = ...,
        flags: int = ...,
    ) -> int: ...  # FreeBSD and Mac OS X only
    ...

兼容性:Unix 系统。

参数

  • checkout_fd - 目标文件描述符。
  • checkin_fd - 源文件描述符。
  • checkoffset - 文件偏移量。
  • checkcount - 复制的字节长度。

返回值

  • checkint - 复制的字节长度,在文件尾可能小于 count。

示例1: - 使用 os.sendfile() 函数复制文件数据。

# coding=utf-8

# Python3 代码
# 讲解怎样使用 os.sendfile() 函数复制文件数据

# 引入 os 模块
import os

# 源文件路径
path = "foo.txt"

# 输出文件路径
out_path = "out.txt"

# 使用 os.open 函数打开文件
# 源文件只需要读权限
in_fd = os.open(path, os.O_RDONLY)

# 输出文件需要读写权限
# 最好加上 CREATE 权限,否则文件不存在会报错
out_fd = os.open(out_path, os.O_RDWR|os.O_CREAT)

# 使用 os.sendfile 函数
# 发送 3 字节数据
offset = 0
count = 3
ret_val = os.sendfile(out_fd, in_fd, offset, count)

print("Send Btyes::", ret_val)

# 关闭文件
os.close(in_fd)
os.close(out_fd)
Send Btyes:: 3

注意:文件如果使用 UTF-8 编码,中文为 3个字节,如果复制不是 3的倍数,可能会产生乱码。