简体   繁体   English

Python中的文件对象是什么类型的?

[英]What type are file objects in Python?

如何使用isinstance确定文件对象的“类型”,例如在表达式中:

>>> open(file)

In Python 2.x, all file objects are of type file :在 Python 2.x 中,所有文件对象都是file类型:

>>> type(open('file.txt'))
<type 'file'>

>>> isinstance(open('file.txt'), file)
True

In Python 3.x however, normal file objects are of type io.TextIOWrapper :然而,在 Python 3.x 中,普通文件对象的类型为io.TextIOWrapper

>>> type(open('file.txt'))
<class '_io.TextIOWrapper'>

>>> from io import TextIOWrapper
>>> isinstance(open('file.txt'), TextIOWrapper)
True

As stated in the documentation for open :open文档中所述

Open a file, returning an object of the file type described in section File Objects .打开一个文件,返回文件对象部分中描述的file类型的对象

Thus, open returns a file , and you should use isinstance(foo, file)因此, open返回一个file ,你应该使用isinstance(foo, file)

Its type is file .它的类型是file You can tell by the output of type(open("file","w"))您可以通过type(open("file","w"))的输出来判断

This answer builds upon the previous answer by user2555451 and its comments.该答案建立在 user2555451 的先前答案及其评论的基础上。 The short answer is to pick your preference from the IO class hierarchy .简短的回答是从IO 类层次结构中选择您的偏好。

For text files , io.TextIOBase can be acceptable:对于文本文件,可以接受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'>)

For text files, avoid io.TextIOWrapper because it does not also work for io.StringIO :对于文本文件,请避免io.TextIOWrapper ,因为它也不适用于io.StringIO

>>> isinstance(io.StringIO('foo'), io.TextIOWrapper)
False
>>> isinstance(io.StringIO('foo'), io.TextIOBase)
True

For binary files , io.BufferedIOBase can be acceptable:对于二进制文件,可以接受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'>)

For binary files, avoid io.BufferedReader or io.BufferedWriter because they do not also work for io.BytesIO :对于二进制文件,请避免io.BufferedReaderio.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

To support both text and binary files , io.IOBase is acceptable:为了同时支持文本和二进制文件io.IOBase是可以接受的:

>>> import io

>>> isinstance(open('/tmp/foo', 'w'), io.IOBase)
True
>>> isinstance(open('/tmp/foo', 'wb'), io.IOBase)
True

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM