Python 將檔案描述符包裝成檔案物件

2021-09-28 20:29:01 字數 2287 閱讀 3258

你有乙個對應於作業系統上乙個已開啟的i/o通道(比如檔案、管道、套接字等)的整型檔案描述符, 你想將它包裝成乙個更高層的python檔案物件。

乙個檔案描述符和乙個開啟的普通檔案是不一樣的。 檔案描述符僅僅是乙個由作業系統指定的整數,用來指代某個系統的i/o通道。 如果你碰巧有這麼乙個檔案描述符,你可以通過使用open()函式來將其包裝為乙個python的檔案物件。 你僅僅只需要使用這個整數值的檔案描述符作為第乙個引數來代替檔名即可。例如:

# open a low-level file descriptor

import os

fd = os.open('somefile.txt', os.o_wronly | os.o_creat)

# turn into a proper file

f = open(fd, 'wt')

f.write('hello world\n')

f.close()

當高層的檔案物件被關閉或者破壞的時候,底層的檔案描述符也會被關閉。 如果這個並不是你想要的結果,你可以給open()函式傳遞乙個可選的colsefd=false。比如:

# create a file object, but don't close underlying fd when done

f = open(fd, 'wt', closefd=false)

...

在unix系統中,這種包裝檔案描述符的技術可以很方便的將乙個類檔案介面作用於乙個以不同方式開啟的i/o通道上, 如管道、套接字等。舉例來講,下面是乙個操作管道的例子:

from socket import socket, af_inet, sock_stream

def echo_client(client_sock, addr):

print('got connection from', addr)

client_in = open(client_sock.fileno(), 'rt', encoding='latin-1',

closefd=false)

client_out = open(client_sock.fileno(), 'wt', encoding='latin-1',

closefd=false)

# echo lines back to the client using file i/o

for line in client_in:

client_out.write(line)

client_out.flush()

client_sock.close()

def echo_server(address):

sock = socket(af_inet, sock_stream)

sock.bind(address)

sock.listen(1)

while true:

client, addr = sock.accept()

echo_client(client, addr)

需要重點強調的一點是,上面的例子僅僅是為了演示內建的open()函式的乙個特性,並且也只適用於基於unix的系統。 如果你想將乙個類檔案介面作用在乙個套接字並希望你的**可以跨平台,請使用套接字物件的makefile()方法。 但是如果不考慮可移植性的話,那上面的解決方案會比使用makefile()效能更好一點。

你也可以使用這種技術來構造乙個別名,允許以不同於第一次開啟檔案的方式使用它。 例如,下面演示如何建立乙個檔案物件,它允許你輸出二進位制資料到標準輸出(通常以文字模式開啟):

import sys

# create a binary-mode file for stdout

>>> bstdout = open(sys.stdout.fileno(), 'wb', closefd=false)

>>> bstdout.write(b"helloworld\n")

11>>> bstdout.flush()

helloworld

儘管可以將乙個已存在的檔案描述符包裝成乙個正常的檔案物件, 但是要注意的是並不是所有的檔案模式都被支援,並且某些型別的檔案描述符可能會有*** (特別是涉及到錯誤處理、檔案結尾條件等等的時候)。 在不同的作業系統上這種行為也是不一樣,特別的,上面的例子都不能在非unix系統上執行。 我說了這麼多,意思就是讓你充分測試自己的實現**,確保它能按照期望工作。

python 將檔案描述符包裝成檔案物件

有乙個對應於作業系統上乙個已開啟的i o 通道 比如檔案 管道 套接字等 的整型檔案描述符,你想將它包裝成乙個更高層的python 檔案物件。乙個檔案描述符和乙個開啟的普通檔案是不一樣的。檔案描述符僅僅是乙個由作業系統指定的整數,用來指代某個系統的i o 通道。如果你碰巧有這麼乙個檔案描述符,你可以...

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...