Python open的类型是什么(文件)

Ale*_*eee 0 python filehandle python-2.7 isinstance

我想使用isinstance内置函数来判断的类型open(file)

怎么做?

谢谢!:D

Acu*_*nus 11

人们可以从IO 类层次结构中选择自己的偏好。这个答案建立在 user2555451 之前的答案及其评论的基础上。一行摘要位于答案的末尾。

对于文本文件io.TextIOBase可以接受:

>>> import io

>>> type(f := open('/tmp/foo', 'w'))
<class '_io.TextIOWrapper'>
>>> isinstance(f, io.TextIOBase)
True

>>> f.__class__.__bases__
(<class '_io._TextIOBase'>,)
>>> f.__class__.__mro__
(<class '_io.TextIOWrapper'>, <class '_io._TextIOBase'>, <class '_io._IOBase'>, <class 'object'>)
Run Code Online (Sandbox Code Playgroud)

对于文本文件,请避免,io.TextIOWrapper因为它不适用于io.StringIO

>>> isinstance(io.StringIO('foo'), io.TextIOWrapper)
False
>>> isinstance(io.StringIO('foo'), io.TextIOBase)
True
Run Code Online (Sandbox Code Playgroud)

对于二进制文件io.BufferedIOBase可以接受:

>>> import io

>>> type(f := open('/tmp/foo', 'wb'))
<class '_io.BufferedWriter'>
>>> isinstance(f, io.BufferedIOBase)
True

>>> f.__class__.__bases__
(<class '_io._BufferedIOBase'>,)
>>> f.__class__.__mro__
(<class '_io.BufferedWriter'>, <class '_io._BufferedIOBase'>, <class '_io._IOBase'>, <class 'object'>)
Run Code Online (Sandbox Code Playgroud)

对于二进制文件,请避免使用io.BufferedReaderor,io.BufferedWriter因为它们不适用于io.BytesIO

>>> isinstance(io.BytesIO(b'foo'), io.BufferedReader)
False
>>> isinstance(io.BytesIO(b'foo'), io.BufferedWriter)
False
>>> isinstance(io.BytesIO(b'foo'), io.BufferedIOBase)
True
Run Code Online (Sandbox Code Playgroud)

支持文本和二进制文件io.IOBase是可以接受的:

>>> import io

>>> isinstance(open('/tmp/foo', 'w'), io.IOBase)
True
>>> isinstance(open('/tmp/foo', 'wb'), io.IOBase)
True
Run Code Online (Sandbox Code Playgroud)

总之,我通常会选择io.TextIOBase文本文件、io.BufferedIOBase二进制文件和io.IOBase非特定文件。


iCo*_*dez 5

在Python 2.x中,所有文件对象的类型均为file

>>> type(open('file.txt'))
<type 'file'>
>>>
>>> isinstance(open('file.txt'), file)
True
>>>
Run Code Online (Sandbox Code Playgroud)

但是,在Python 3.x中,普通文件对象的类型为io.TextIOWrapper

>>> type(open('file.txt'))
<class '_io.TextIOWrapper'>
>>>
>>> from io import TextIOWrapper
>>> isinstance(open('file.txt'), TextIOWrapper)
True
>>>
Run Code Online (Sandbox Code Playgroud)

  • 不过,大多数时候,您并不在乎。您关心它是行的迭代,还是它具有“读取”方法或“写入”方法,或与文件接口有关的其他内容。那就是您应该检查的内容,通常是简单地尝试像文件一样使用对象,并在错误不支持所需接口时捕获错误。 (3认同)
  • `TextIOWrapper` 是在默认/文本模式下打开时返回的内容,`BufferedReader` 是在二进制('b')模式下获得的内容,因此您可以单独检查,也可以根据需要使用其超类 `IOBase`抓住两个 (3认同)