Using "with" statement for CSV files in Python
Question: Is it possible to use the `with` statement directly with CSV files? It seems
natural to be able to do something like this:

    
    
    import csv
    with csv.reader(open("myfile.csv")) as reader:
        # do things with reader
    

But csv.reader doesn't provide the `__enter__` and `__exit__` methods, so this
doesn't work. I can however do it in two steps:

    
    
    import csv
    with open("myfile.csv") as f:
        reader = csv.reader(f)
        # do things with reader
    

Is this second way the ideal way to do it? Why wouldn't they make csv.reader
directly compatible with the with statement?


Answer: The primary use of `with` statement is an exception-safe cleanup of an object
used in the statement. `with` makes sure that files are closed, locks are
released, contexts are restored, etc.

Does [csv.reader](http://docs.python.org/library/csv.html#csv.reader) have
things to cleanup in case of exception?

I'd go with:

    
    
    with open("myfile.csv") as f:
        for row in csv.reader(f):
            # process row
    

You don't need to submit the patch to use `csv.reader` and `with` statement
together.

    
    
    import contextlib
    

Help on function contextmanager in module
[contextlib](http://docs.python.org/library/contextlib.html):

    
    
    contextmanager(func)
        @contextmanager decorator.
    

Typical usage:

    
    
        @contextmanager
        def some_generator(<arguments>):
            <setup>
            try:
                yield <value>
            finally:
                <cleanup>
    

This makes this:

    
    
        with some_generator(<arguments>) as <variable>:
            <body>
    

equivalent to this:

    
    
        <setup>
        try:
            <variable> = <value>
            <body>
        finally:
            <cleanup>
    

Here's a concrete example how I've used it:
[curses_screen](http://stackoverflow.com/questions/327026/attribute-bold-
doesnt-seem-to-work-in-my-curses#327072).

