對於流打開的讀取,也許是最可靠的方式以確定其模式實際上從中讀取:
def is_binary(f):
return isinstance(f.read(0), bytes)
通過它確實有一個需要注意的是,如果流已經關閉,它不會工作(可能提高IOError
)將可靠地確定二進制任何自定義文件類對象都不適合從io
ABCs擴展,也不提供mode
屬性。
如果只需要Python 3的支持,也能夠確定給定的字節數和文本之間的明顯區別可寫流的文本/二進制模式:
def is_binary(f):
read = getattr(f, 'read', None)
if read is not None:
try:
data = read(0)
except (TypeError, ValueError):
pass # ValueError is also a superclass of io.UnsupportedOperation
else:
return isinstance(data, bytes)
try:
# alternatively, replace with empty text literal
# and swap the following True and False.
f.write(b'')
except TypeError:
return False
return True
除非你是經常測試,如果流是二進制模式還是不行(這是不必要的,因爲流的二進制不應該在對象的生命週期中改變),我懷疑由於廣泛使用捕捉異常導致的性能缺陷將是一個問題(你當然可以優化儘管如此)。
非常好,也感謝文檔鏈接,並指向我的io模塊。我只在詞彙表中找到了[文件對象](https://docs.python.org/3.6/glossary.html#term-file-object)的定義,這是非常膚淺的。此外,現在我認爲關於它,另一種pythonic方式可能只是嘗試閱讀,如果失敗則會發生異常。 – jdm
@jdm:cool!您希望我添加什麼來獲得接受標記? (如果你沒有將答案標記爲已接受,只是想確保沒有遺漏任何東西就沒關係):-) –
不,答案很好,絕對接受:-) – jdm