0

因为文件不能在 python 3 中使用。

在python 2中,我们判断一个文件类型可以这样做:

with open("xxx.txt") as f:
    if isinstance(f, file):
        print("ok!")

在 python 3 中,我们可以这样做:

import io
with open("xxx.txt") as f:
    if isinstance(f, io.IOBase)
        print("ok!")

但是第二个代码不能在 python 2 中工作。

那么,有没有办法判断一个文件类型在 python 2 和 python 3 中都可以工作。

4

1 回答 1

2

您可以使用元组测试两者;使用NameError警卫在 Python 3 上完成这项工作:

import io

try:
    filetypes = (io.IOBase, file)
except NameError:
    filetypes = io.IOBase

isinstance(f, filetypes)

您需要在 Python 2 上测试两者,因为您也可以在io那里使用该库。

但是,最好使用鸭子类型而不是测试io.IOBase; 有关动机,请参阅检查对象是否在 Python 中类似于文件。最好检查您需要的方法是否存在:

if hasattr(f, 'read'):

请注意,io.IOBase它甚至不包括read. 在 Python 2 中,StringIO.StringIO它也是一个类似文件的对象,它isinstance(.., file)不支持。

于 2014-09-09T07:09:59.123 回答