用1行代码打开读取和closures文件

现在我用:

pageHeadSectionFile = open('pagehead.section.htm','r') output = pageHeadSectionFile.read() pageHeadSectionFile.close() 

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

 output = open('pagehead.section.htm','r').read() 

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

你不必closures它 – Python会在垃圾回收或程序退出时自动执行。 但是,@delnan指出,由于各种原因明确closures它是更好的做法。

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

 with open('pagehead.section.htm','r') as f: output = f.read() 

现在这只是两条线,我认为是非常可读的。

使用CPython,您的文件将在执行后立即closures,因为文件对象立即被垃圾收集。 但是有两个缺点:

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

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

最好另外投资一条线路:

 with open('pagehead.section.htm','r') as f: output = f.read() 

这将确保文件在任何情况下都能正确closures。

你可以做的是使用with语句:

 >>> with open('pagehead.section.htm', 'r') as fin: ... output = fin.read() 

with语句将小心地调用给定对象的__exit__函数,即使代码中发生了什么不良情况。 它接近try... finally语法。 对于open返回的对象, __exit__对应于文件closures。

这个声明已经在Python 2.6中引入了。

使用ilio :(inline io):

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

 from ilio import read content = read('filename') 

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

 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' 
 with open('pagehead.section.htm')as f:contents=f.read() 

我经常做这样的事情,当我需要围绕一些我已经在日志文件中grepped的几行:

 $ grep -n "xlrd" requirements.txt | awk -F ":" '{print $1}' 54 $ python -c "with open('requirements.txt') as file: print ''.join(file.readlines()[52:55])" wsgiref==0.1.2 xlrd==0.9.2 xlwt==0.7.5 

使用more_itertools.with_iter ,可以在一行(不包括导入语句)中打开,读取,closures和分配等价的output

 import more_itertools as mit output = "".join(line for line in mit.with_iter(open("pagehead.section.htm", "r"))) 

虽然可能,但我会寻找另一种方法,而不是将文件的内容分配给variables,即惰性迭代 – 可以使用传统with块或上面的示例中通过删除join()和迭代output

不需要导入任何特别的东西。

只要使用正常的语法,它会打开文件进行阅读,然后closures它。

 with open("/etc/hostname","r") as f: print f.read() 

要么

 with open("/etc/hosts","r") as f: x = f.read().splitlines() 

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

 for i in range(len(x)): print x[i] 

这些单线非常明显。