用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,因为文件对象立即被垃圾收集。 但是有两个缺点:
-
在与CPython不同的Python实现中,文件通常不会立即closures,而是在以后的时间,超出您的控制范围。
-
在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]
这些单线非常明显。