{with io.open“是否自动关闭文件?

时间:2018-07-27 10:34:47

标签: python io

例如:

with io.open('Example.txt','r',encoding='utf-8') as temp:
    ExampleText=temp.readlines()[1]

我是否需要手动将其关闭,例如:

with io.open('Example.txt','r',encoding='utf-8') as temp:
    ExampleText=temp.readlines()[1]
temp.close()

3 个答案:

答案 0 :(得分:4)

TL; DR:不,与with语句一起使用时,您不需要关闭流。

其原因是TextIOWrapper返回的io.open对象是一个上下文管理器,当退出上下文时,它将在基础文件上调用close

要验证此行为,我们可以简单地显式调用__exit__,然后尝试读取文件:

>>> import io
>>> foo = io.open("foo.txt", "w+")
>>> foo.__exit__()
>>> foo.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.

这表明在调用__exit__时文件实际上是关闭的,而在退出with块时会自动发生。

请注意,在某些情况下,不会在__exit__上关闭文件描述符,也就是将文件描述符而不是文件名或对象传递给io.open的情况False参数的值为closefd

>>> import os
>>> file_ = open("foo.txt", "w+")
>>> foo = io.open(file_.fileno(), closefd=False)
>>> foo.__exit__()
>>> # the IOTextWrapper is closed
>>> foo.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
>>> # but the underlying file descriptor is not closed.
>>> os.read(file_.fileno(), 512)
b''

如果您为True参数传递了一个closefd值,则在上下文退出时关闭了所传递的文件描述符:

>>> with io.open(file_.fileno(), closefd=True):
...     pass
>>> os.read(file_.fileno(), 512)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 9] Bad file descriptor

详细描述此行为的文档可以在here中找到。

答案 1 :(得分:1)

否,您不需要手动关闭它。

答案 2 :(得分:1)

reference

  

如果提供了文件描述符,则除非将closefd设置为False,否则当关闭返回的I / O对象时,它将关闭。

因此,如果您提供文件描述符并希望手动将其关闭(因为以后可能会使用描述符),则将其称为

import os
import io
fd = os.open("foo.txt", os.O_RDONLY)
io.open(fd, 'r', encoding='utf-8', closefd=False)