文件描述字(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. MyBatis架构设计及源代码分析系列(一):MyBatis架构

    如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...

  2. 【bzoj2463】 谁能赢呢?

    www.lydsy.com/JudgeOnline/problem.php?id=2463 (题目链接) 题意 一个n*n的棋盘,开始时左上角有一个棋子,每次可以把棋子向4个方向移动,但不能移动到曾经 ...

  3. java订电影票系统

    public class Test { public static void main(String[] args) { BookTicket bookTicket = new BookTicket( ...

  4. java + jquery + ajax + json 交互

    前端js部分: $.ajax({ async:true, cache:false, type:"POST", dataType : 'json', url:"/shopp ...

  5. easyui 动态修改窗口title

    http://blog.csdn.net/liu251890347/article/details/39292307?utm_source=tuicool 使用easyui作为前台框架极大的节省了项目 ...

  6. PHP时间比较和时间差如何计算

    1.<?php 2. $zero1=date(“y-m-d h:i:s”); 3. $zero2=”2010-11-29 21:07:00′; 4. echo “zero1的时间为:”.$zer ...

  7. IIS负载均衡-Application Request Route详解第一篇: ARR介绍(转载)

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...

  8. 在.NET 环境中实现每日构建(Daily Build)--ccnet,MSBuild篇(转载)

    每日构建,对我们团队来说一个全新的概念.随着项目开发的进展,在开发过 程需要及时反馈一些BUG和功能要求的处理情况.而在这种情况下每天或隔一段时间Build一个版本,工作量还是比较大的,所以就特别有必 ...

  9. 使用SqlSessionTemplate实现数据库的操作

    EmployeeMapper.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE map ...

  10. ssh框架整合完整版

    1.导入jar包 可以在src下添加一个log4j.properties文件来记录日志 2.加入实体类+映射文件 映射:从类入手class+属性 a.映射的头文件在:hibernate3.jar--& ...