문제

은 그것을 사용하는 것이 가능하 with 문와 직접 CSV 파일이 있는가?그것은 자연 보인할 수 있을 다음과 같은 것이 가능합니다.

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

하지만 csv.리더를 제공하지 않는 __enter____exit__ 방법,그래서 이것은 작동하지 않는다.나는 그러나에 그렇게 두 가지 단계:

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

은 이 두 번째 방법이 이상적인 방법으로 할 수 있나요?왜 그들이 만드는 csv.독자를 직접 호환 가진 문장인가요?

도움이 되었습니까?

해결책

의 기본 사용 with 문는 예외 안전 정의는 객체에 사용되는 문입니다. with 는지 확인 파일을 닫,잠금,해제 상황은 복원,등등.

csv.독 는 일들을 정리의 경우에는 예외?

나와 함께 이동:

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

당신이 필요하지 않 제출 패치 사용하기 csv.readerwith 문 함께.

import contextlib

도움말 기능에 contextmanager 모듈 contextlib:

contextmanager(func)
    @contextmanager decorator.

일반적인 사용:

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

이:

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

해당하는 this:

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

여기에 구체적인 예는 어떻게 나는 그것을 사용: curses_screen.

다른 팁

그렇습니다.두 번째 방법이 올바른 것입니다.

왜?누가 이제까지 알고 있습니다.당신이 바로,그것은 아마도 쉽게 변경합니다.그것으로 높은 우선 순위는 다른 것들입니다.

당신은 쉽게 만들 수 있습니다 당신의 자신의 패치 키트에 제출.

문제입니다 csv.리더하지 않는 정말 관리 context.그것은 허용할 수 있습니다 반복 가능한 아일이다.따라서 그렇지 않에서 close 를 호출하는 입력(부수적으로 그것이 경우에 당신이 사용할 수 있습 contextlib.닫).그래서 그것은 분명하지 않은 무엇이 컨텍스트를 위한 지원을 제공합니다.독자는 것이 실제로는 않습니다.

import csv

class CSV(object):
    def __init__(self,path,mode):
        self.path = path
        self.mode = mode
        self.file = None

    def __enter__(self):
        self.file = open(self.path,self.mode)
        if self.mode == 'r':
            return csv.reader(self.file)
        elif self.mode == 'w':
            return csv.writer(self.file)

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()   

with CSV('data.csv','r') as reader:
    for row in reader:
        print row

로 쉽게 당신이 원하는 무엇을 사용하여 발생기 기능:


import csv
from contextlib import contextmanager

@contextmanager
def opencsv(path):
   yield csv.reader(open(path))

with opencsv("myfile.csv") as reader:
   # do stuff with your csvreader
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top