文件描述字(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. 【POJ 2243】Knight Moves

    题 Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are ...

  2. Teradata(不同date输出要求;表类型)

    1. 需要某种特定形式的date 类型export 到文件中,例如 YYYYMMDD/ YYYY-MM-DD 这时候不一定非要用date 类型,可以转换为varchar 类型! CAST(CAST ( ...

  3. C++ STL初学笔记

    C++  STL初学笔记 更系统的版本见徐本柱的PPT set 在这儿:http://www.cnblogs.com/pdev/p/4035020.html #include <vector&g ...

  4. 排序算法二(时间复杂度为O(N*logN))

    快速排序: 1 package test; public class QuickSort { // 快速排序 public void quickSort(int s[], int l, int r) ...

  5. IPC机制

    转:http://blog.chinaunix.net/uid-26125381-id-3206237.html  IPC 三种通信机制 2012-05-13 17:23:55 最近看了,IPC三种通 ...

  6. Spring学习8-用MyEclipse搭建SSH框架 Struts Spring Hibernate

    1.new一个web project. 2.右键项目,为项目添加Struts支持. 点击Finish.src目录下多了struts.xml配置文件. 3.使用MyEclipse DataBase Ex ...

  7. TEXT宏,TCHAR类型

    TCHAR *ptch = TEXT("This is a const string."); 如果使用UNICODE字符集, 则TEXT("This is a const ...

  8. MACD、BOLL、KDJ 三大组合精准把握趋势与买卖!

    先看示意图,下图是布林线的3个轨道,其他都是股价走势 图1 股价,在布林线上轨.下轨之间运作.准确说,这话是不符合逻辑的,不是先有的轨道,然后股价再按照轨道运动.因为轨道是跟股价同时变化的.但是,股价 ...

  9. Protocol Buffer技术详解(语言规范)

    Protocol Buffer技术详解(语言规范) 该系列Blog的内容主体主要源自于Protocol Buffer的官方文档,而代码示例则抽取于当前正在开发的一个公司内部项目的Demo.这样做的目的 ...

  10. Hadoop的datanode无法启动

    Hadoop的datanode无法启动 hdfs-site中配置的dfs.data.dir为/usr/local/hadoop/hdfs/data 用bin/hadoop start-all.sh启动 ...