如何在Python 2和3中判断文件类型

0 投票
1 回答
948 浏览
提问于 2025-04-20 14:44

因为在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中都能判断文件类型呢?

1 个回答

2

你可以用一个元组来同时测试两种情况;在Python 3中,使用一个NameError的保护措施来让这个方法有效:

import io

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

isinstance(f, filetypes)

在Python 2中,你也需要同时测试这两种情况,因为你也可以使用io库。

不过,最好使用鸭子类型,而不是直接测试io.IOBase;想了解更多原因,可以看看如何检查对象是否像文件一样。更好的做法是检查你需要的方法是否存在:

if hasattr(f, 'read'):

需要注意的是,io.IOBase甚至不包含read方法。而在Python 2中,StringIO.StringIO也是一个像文件一样的对象,但isinstance(.., file)并不支持它。

撰写回答