(原創)Python文件與文件系統系列(4)——文件描述字操做

  文件描述字(file descriptor,fd)是系統中用來惟一記錄當前已經打開的文件的標識號,fd是一個整數。python

  除了file對象外,Python還提供對fd的操做,對fd的操做更加底層,fd和Python中的file對象是不一樣的概念。在介紹file對象時已經提過,調用 f.fileno() 能夠得到一個文件對象的fd,也能夠在一個已有的 fd 上在封裝一個 file 對象:f = os.fdopen(fd)。函數

  一些 fd 是一個進程建立時事先分配好的:code

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

Python中的os模塊對於fd提供了以下的方法:對象

1. 關閉 fdblog

os.close(fd)

 

2. 複製fd進程

os.dup(fd)

  返回一個新的fd1,這個fd1複製了參數fd。ip

 

3. 複製fd字符串

os.dup2(fd, fd2)

  將 fd 複製到 fd2,若是 fd2 已經打開,則首先關閉它。同步

 

4. 從 fd 到 file 對象it

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 對應的文件中,返回實際寫入的字節數。

相關文章
相關標籤/搜索