在Python中使用CSV文件的"with"语句

Kiv*_*Kiv 20 python csv with-statement

是否可以with直接在CSV文件中使用该语句?能够做这样的事情似乎很自然:

import csv
with csv.reader(open("myfile.csv")) as reader:
    # do things with reader
Run Code Online (Sandbox Code Playgroud)

但是csv.reader没有提供__enter____exit__方法,所以这不起作用.但是,我可以分两步完成:

import csv
with open("myfile.csv") as f:
    reader = csv.reader(f)
    # do things with reader
Run Code Online (Sandbox Code Playgroud)

第二种方式是理想的做法吗?为什么不让csv.reader直接与with语句兼容?

jfs*_*jfs 19

withstatement 的主要用途是对语句中使用的对象进行异常安全的清理.with确保关闭文件,释放锁定,恢复上下文等.

如果出现异常,csv.reader是否有清理的东西?

我会去:

with open("myfile.csv") as f:
    for row in csv.reader(f):
        # process row
Run Code Online (Sandbox Code Playgroud)

您无需一起提交要使用csv.readerwith声明的补丁.

import contextlib
Run Code Online (Sandbox Code Playgroud)

有关模块contextlib中的函数contextmanager的帮助:

contextmanager(func)
    @contextmanager decorator.
Run Code Online (Sandbox Code Playgroud)

典型用法:

    @contextmanager
    def some_generator(<arguments>):
        <setup>
        try:
            yield <value>
        finally:
            <cleanup>
Run Code Online (Sandbox Code Playgroud)

这使得:

    with some_generator(<arguments>) as <variable>:
        <body>
Run Code Online (Sandbox Code Playgroud)

相当于:

    <setup>
    try:
        <variable> = <value>
        <body>
    finally:
        <cleanup>
Run Code Online (Sandbox Code Playgroud)

这是我如何使用它的具体示例:curses_screen.

  • @JFSebastion:我认为所有"数据压缩"和"文件格式"库模块都应该直接支持. (3认同)