如何在Python 2和3中判断文件类型
因为在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)
并不支持它。