打开读取并关闭1行代码中的文件

1qa*_*sw2 109 python readfile

现在我使用:

pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
Run Code Online (Sandbox Code Playgroud)

但为了使代码看起来更好,我可以这样做:

output = open('pagehead.section.htm','r').read()
Run Code Online (Sandbox Code Playgroud)

使用上述语法时,如何关闭文件以释放系统资源?

Tim*_*ker 171

您不必关闭它 - Python将在垃圾收集期间或程序退出时自动执行此操作.但正如@delnan指出的那样,出于各种原因明确关闭它是更好的做法.

那么,你可以做些什么来保持简短,明确:

with open('pagehead.section.htm','r') as f:
    output = f.read()
Run Code Online (Sandbox Code Playgroud)

我认为现在它只有两行而且非常易读.

  • 重新写第一句话:Python将最终关闭它*.但这并不意味着你应该忘记关闭.即使使用引用计数,文件也可能比您想象的要长得多(例如,如果它恰好通过循环引用).这在具有体面GC的Python实现中需要三倍,在这种情况下,您无法保证在任何特定时间都有GC.甚至[CPython文档](http://docs.python.org/reference/datamodel.html)都说你不应该像这样依赖GC进行清理.答案的后半部分应该是大胆的. (11认同)
  • 如果你真的需要*one-liner*,可以将`output = f.read()`部分放在`:`之后的同一行上. (6认同)
  • 答案已过时。使用现代 python 的正确答案是 `Path('pagehead.section.htm').read_text()` (4认同)
  • @ 1qazxsw2如果使用[`with`语句](http://docs.python.org/reference/compound_stmts.html#with),文件资源将为您正确关闭。 (2认同)
  • “在 1 行代码中打开读取和关闭文件”这是两行,并没有回答问题。 (2认同)

Jan*_*zny 44

Python标准库Pathlib模块可以满足您的需求:

Path('pagehead.section.htm').read_text()
Run Code Online (Sandbox Code Playgroud)

别忘了导入路径:

jsk@dev1:~$ python3
Python 3.5.2 (default, Sep 10 2016, 08:21:44)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pathlib import Path
>>> (Path("/etc") / "hostname").read_text()
'dev1.example\n'
Run Code Online (Sandbox Code Playgroud)

在Python 27上安装backported pathlibpathlib2

  • 提出`with`的其他答案很好,但`with`是一个陈述,而不是表达.这个`pathlib`答案是对可嵌入Python表达式的原始问题的唯一回复.类似于`SECRET_KEY = os.environ.get('SECRET_KEY')或pathlib.Path('SECRET_KEY').read_bytes()` (6认同)

Sve*_*ach 19

使用CPython,您的文件将在执行该行后立即关闭,因为文件对象会立即被垃圾回收.但有两个缺点:

  1. 在与CPython不同的Python实现中,文件通常不会立即关闭,而是在以后的时间内,超出您的控制范围.

  2. 在Python 3.2或更高版本中ResourceWarning,如果启用,将抛出一个.

最好再投资一条线:

with open('pagehead.section.htm','r') as f:
    output = f.read()
Run Code Online (Sandbox Code Playgroud)

这将确保在所有情况下正确关闭文件.


SDs*_*lar 13

无需导入任何特殊库来执行此操作.

使用普通语法,它将打开文件进行读取然后关闭它.

with open("/etc/hostname","r") as f: print f.read() 
Run Code Online (Sandbox Code Playgroud)

要么

with open("/etc/hosts","r") as f: x = f.read().splitlines()
Run Code Online (Sandbox Code Playgroud)

它给你一个包含线条的数组x,可以这样打印:

for line in x: print line
Run Code Online (Sandbox Code Playgroud)

这些单行程对维护非常有帮助 - 基本上是自我记录.


Joë*_*oël 8

你可以做的是使用with声明:

>>> with open('pagehead.section.htm', 'r') as fin: output = fin.read();
>>> print(output)
some content
Run Code Online (Sandbox Code Playgroud)

即使代码中发生了不好的事情,该with语句也会注意调用__exit__给定对象的函数; 它接近try... finally语法.对于返回的对象open,__exit__对应于文件关闭.

Python 2.6引入了这个语句.


ima*_*man 5

使用ilio :(内联io):

只有一个函数调用而不是文件open(),read(),close().

from ilio import read

content = read('filename')
Run Code Online (Sandbox Code Playgroud)


Adr*_*vao 5

我认为实现这一点最自然的方法是定义一个函数。

def read(filename):
    f = open(filename, 'r')
    output = f.read()
    f.close()
    return output
Run Code Online (Sandbox Code Playgroud)

然后您可以执行以下操作:

output = read('pagehead.section.htm')
Run Code Online (Sandbox Code Playgroud)