<p>对于3.1+,请执行以下操作之一:</p>
<pre><code>isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
</code></pre>
<p>对于2.x来说,“类似文件的对象”是一个很模糊的东西,无法检查,但是您正在处理的任何函数的文档都可能告诉您它们实际需要什么;如果没有,请阅读代码。</p>
<hr/>
<p>正如其他答案所指出的,首先要问的是你到底在查什么。通常,EAFP是足够的,而且更习惯。</p>
<p><a href="https://docs.python.org/3/glossary.html#term-file-object">The glossary</a>说“类文件对象”是“文件对象”的同义词,这最终意味着它是<a href="https://docs.python.org/3/library/io.html#class-hierarchy">the ^{<cd1>} module</a>中定义的三个<a href="https://docs.python.org/3/library/abc.html">abstract base classes</a>中的一个实例,它们本身都是<code>IOBase</code>的子类。所以,检查的方法正是上面所示的。</p>
<p>(但是,检查<code>IOBase</code>不是很有用。你能想象这样一种情况吗:你需要把一个像<code>read(size)</code>这样的实际文件与一个名为<code>read</code>的不象文件的参数函数区分开来,而不需要区分文本文件和原始二进制文件?所以,实际上,您几乎总是想检查,例如,“是文本文件对象”,而不是“是类似文件的对象”。)</p>
<hr/>
<p>对于2.x,虽然<code>io</code>模块自2.6+以来就已经存在,但内置文件对象不是<code>io</code>类的实例,stdlib中也不是任何类似文件的对象,也不是您可能遇到的大多数类似第三方文件的对象。“类文件对象”的含义没有官方定义;它只是“类似于内置的<a href="https://docs.python.org/2.7/library/stdtypes.html#bltin-file-objects">file object</a>”,不同的函数用“类”表示不同的东西。这些函数应该记录它们的含义;如果它们没有,则必须查看代码。</p>
<p>但是,最常见的含义是“has <code>read(size)</code>”、“has <code>read()</code>”或“is a iterable of strings”,但是一些旧库可能期望<code>readline</code>而不是其中之一,有些库喜欢您给它们的<code>close()</code>文件,有些库希望如果<code>fileno</code>存在,则可以使用其他功能,等等,对于<code>write(buf)</code>也同样如此(尽管在这个方向上有更少的选择)。</p>