文件描述字(file descriptor,fd)是系统中用来唯一记录当前已经打开的文件的标识号,fd是一个整数。

  除了file对象外,Python还提供对fd的操作,对fd的操作更加底层,fd和Python中的file对象是不同的概念。在介绍file对象时已经提过,调用 f.fileno() 可以获得一个文件对象的fd,也可以在一个已有的 fd 上在封装一个 file 对象:f = os.fdopen(fd)。

  一些 fd 是一个进程创建时事先分配好的:

  • 0——进程的stdin
  • 1——进程的stdout
  • 2——进程的stderr

Python中的os模块对于fd提供了如下的方法:

1. 关闭 fd

os.close(fd)

2. 复制fd

os.dup(fd)

  返回一个新的fd1,这个fd1复制了参数fd。

3. 复制fd

os.dup2(fd, fd2)

  将 fd 复制到 fd2,如果 fd2 已经打开,则首先关闭它。

4. 从 fd 到 file 对象

os.fdopen(fd, mode='r', bufsize=-1)

    返回一个封装了fd的Python file 对象,参数 mode bufsize 和内置的open()函数中的对应参数含义相同。

5. 从 fd 获得文件的各种属性

os.fstat(fd)

  返回一个 stat_result 类型的实例 x,和os.stat(path)返回的类型相同,只是这里是通过一个 fd 获得对应文件的相关属性。

6. 改变 fd 对应文件的当前位置

os.lseek(fd, pos, how)

  效果同 f.seek(pos, how),参数 how 指定了参照点,一共三种,分别是:os.SEEK_SET == 0 (文件起始)、os.SEEK_CUR == 1(当前位置)和os.SEEK_END == 2(文件末尾).

  没有类似 f.tell() 这种,可以直接使用 fd 获得文件当前位置的函数,实际上使用 os.lseek() 就可以自己实现一个,

os.lseek(fd, 0, os.SEEK_CUR)

  就可以返回当前fd 对应文件的位置,且不会对原文件造成影响。

7. 打开文件,获得fd

os.open(file, flags, mode=0777)

  参数的意义:

  • file:要打开的文件的路径
  • flags:打开文件的方式,具体的可选值如下。
  • mode:如果os.open()函数创建了新文件,则使用 mode 作为其访问权限位。

  参数 flags 的可选值:

  • os.O_RDONLY:只读打开
  • os.O_WRONLY:只写打开
  • os.O_RDWR:读写打开

  (前三种只能有一种出现在 flags 中)

  • os.O_NDELAY:
  • os.O_NONBLOCK:

  上面这两种表示以非阻塞(nonblocking、no-delay)模式打开 file

  • os.O_APPEND:追加内容到当前文件;
  • os.O_DSYNC:
  • os.O_RSYNC:
  • os.O_SYNC:
  • os.O_NOCTTY:

  上面的四种符号设置打开文件对应的同步模式(synchronization mode)

  • os.O_CREAT:如果文件不存在,就创建之;
  • os.O_EXCL:如果文件已经存在,则抛出异常;
  • os.O_TRUNC:丢弃 file 已有的内容,不能和 O_RDONLY 共用;
  • os.O_BINARY:在非Unix平台,以二进制模式打开文件,在Unix平台,没有效果。

8. 创建管道

os.pipe()

  创建一个管道,返回两个 fd 组成的元组 ——(rfd, wfd),分别用来进行读写操作。

9. 从 fd 对应的文件中读取数据

os.read(fd, n)

  从 fd 对应的文件中读取不超过 n 字节的内容(当前所剩可读的内容可能少于n字节),以字符串形式返回读取到的内容。

10. 向 fd 对应的文件写数据

os.write(fd, s)

  将字符串 s 中的数据写到 fd 对应的文件中,返回实际写入的字节数。

(原创)Python文件与文件系统系列(4)——文件描述字操作的更多相关文章

  1. (原创)Python文件与文件系统系列(1)—— file 对象

    本系列将从四个部分简单介绍Python对文件系统的操作与支持: 1. Python内置的 file 对象 2. Python的os模块对文件.文件系统操作的支持 3. Python的os.path模块 ...

  2. (原创)Python文件与文件系统系列(3)——os.path模块

    os.path 模块实现了一些操作路径名字符串的函数,可以通过 import os.path 使用该模块,不过即使仅仅 import os 也可以使用该模块的方法. 1. abspath(path) ...

  3. (原创)Python文件与文件系统系列(2)——os模块对文件、文件系统操作的支持

    os模块的功能主要包括文件系统部分和进程管理部分,这里介绍其中与文件系统相关的部分. 当请求操作系统执行操作失败时,os模块抛出内置异常 exceptions.OSError 的实例,可以通过 os. ...

  4. (原创)Python文件与文件系统系列(5)——stat模块

    stat模块中定义了许多的常量和函数,可以帮助解释 os.stat().os.fstat().os.lstat()等函数返回的 st_result 类型的对象. 通常使用 os.path.is*() ...

  5. python递归、collections系列以及文件操作进阶

    global log 127.0.0.1 local2 daemon maxconn log 127.0.0.1 local2 info defaults log global mode http t ...

  6. Python 踩坑之旅文件系统篇其一文件夹也是个文件

    目录 1.1 案例 1.2 分析 1.3 扩展 1.4 技术关键字 下期预告 代码示例支持 平台: Mac OS Python: 2.7.10 代码示例: - wx: 菜单 - Python踩坑指南代 ...

  7. [原创]Python批量操作文件,批量合并

    最近几个小伙伴在手动合并一些文本文件,感觉可以用Python批量实现,就有了这段代码 import os import re import sys def printEnter(f1): #每两个文件 ...

  8. 【原创】控制perl和python脚本执行过程中脚本文件是否关闭的方法

    引子 跟踪perl和python脚本对文件的访问,实际过程中,perl和python解析器在解析完脚本后,直接关闭了 脚本文件,在进程中查询不到是访问文件的脚本文件名称. shell.perl和pyt ...

  9. Python之文件及文件系统

    open() 方法: Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError. 注意:使用 open( ...

随机推荐

  1. POJ3579 Median

    Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numb ...

  2. 02 C语言指针

    今天发帖记录自己学习C语言精髓的心理历程,人生就像是一次旅途,沿途总是能看到最美的风景,让我们的思想相逢在C语言中. 一 初识指针,指针的定义 指针是C语言中的一种类型,类似于整形,字符型等.既然C指 ...

  3. std::auto_ptr

    auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII,在构造的 ...

  4. python之BIF函数在列表中的应用

    1 Python 3.3.4 (v3.3.4:7ff62415e426, Feb 10 2014, 18:13:51) [MSC v.1600 64 bit (AMD64)] on win32 2 T ...

  5. mysql delete删除记录数据库空间不减少问题解决方法

    记得在中学时学计算机时老师就告诉我delete删除记录只是给数据库中的记录加一个删除标识了,这样数据库空间并不是减少了,当时没想这么多,昨天发现一个数据库利用delete 删除之后容量没变,后来百度了 ...

  6. Android SDK Manager和AVD Manager使用

    Android SDK Manager和AVD Manager使用(win7_64bit下测试) 目录 1.概述 2.本文用到的工具 3.安卓开发基础工具包下载 4.Android SDK Manag ...

  7. [pdf.js]预览pdf时,中文名称乱码的问题

    在项目中使用了pdf.js的方式预览pdf,但针对中文名称的时候会出现乱码,导致找不到该文件而出现错误. 解决办法 <script src="viewer.js" chars ...

  8. C++中的异常处理(二)

    C++中的异常处理(二) 标签: c++C++异常处理 2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报  分类: C++编程语言(24)  版权声明:本文为博主原创文章,未经 ...

  9. 【原创】express3.4.8源码解析之中间件

    前言 注意:旧文章转成markdown格式. 中间件(middleware)的概念来自于TJ的connect库,express就是建立在connect之上. 就如同connect的意思是 连接 一样, ...

  10. TYVJ2477 架设电话线

    题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用.     FJ的农场周围分布着N(1 <= N < ...