我今天第一次遇到Python with语句。我已经简单地使用Python几个月了,甚至不知道它的存在!鉴于它的地位有些模糊,我认为有必要问一下:

Python with语句是什么 设计用于? 是什么 你用它干什么? 有吗? 我需要注意的问题,还是 相关联的常见反模式 它的使用?在什么情况下try. finally比with更好? 为什么它没有被更广泛地使用呢? 哪些标准库类与它兼容?


当前回答

在python中,通常使用" with "语句打开文件,处理文件中的数据,并在不调用close()方法的情况下关闭文件。" with "语句通过提供清理活动简化了异常处理。

with的一般形式:

with open(“file name”, “mode”) as file_var:
    processing statements

注意:不需要在file_var.close()上调用close()来关闭文件

其他回答

同样,为了完整起见,我将添加最有用的with语句用例。

我做了很多科学计算,对于一些活动,我需要Decimal库进行任意精度计算。我的代码的某些部分我需要较高的精度,而对于大多数其他部分我需要较低的精度。

我将我的默认精度设置为一个较低的数字,然后使用with来获得一些部分的更精确的答案:

from decimal import localcontext

with localcontext() as ctx:
    ctx.prec = 42   # Perform a high precision calculation
    s = calculate_something()
s = +s  # Round the final result back to the default precision

我在Hypergeometric Test中经常使用这种方法,因为它需要对大数进行阶乘。当你进行基因组规模计算时,你必须小心四舍五入和溢出错误。

这里的答案很棒,但我只想补充一个帮助我的简单答案:

with open("foo.txt") as file:
    data = file.read()

Open返回一个文件 自2.6以来,python在文件中添加了__enter__和__exit__方法。 With类似于一个for循环,调用__enter__,运行一次循环,然后调用__exit__ With作用于任何具有__enter__和__exit__的实例

在__exit__关闭文件之前,文件是锁定的,不能被其他进程重用。

来源:http://web.archive.org/web/20180310054708/http: / / effbot.org/zone/python-with-statement.htm

参见PEP 343 - 'with'语句,末尾有一个示例部分。

... 新的语句"with"到Python 制造语言 可以排除try/finally语句的标准用法。

第1点、第2点和第3点得到了很好的阐述:

4:它相对较新,仅在python2.6+中可用(或python2.5使用from __future__ import with_statement)

反模式的一个例子可能是在循环内部使用with,而在循环外部使用with会更有效

例如

for row in lines:
    with open("outfile","a") as f:
        f.write(row)

vs

with open("outfile","a") as f:
    for row in lines:
        f.write(row)

第一种方法是为每一行打开和关闭文件,与第二种只打开和关闭一次文件的方法相比,这可能会导致性能问题。