를 사용하여""와 문을 위한 CSV 파일에서는 파이썬
-
22-07-2019 - |
문제
은 그것을 사용하는 것이 가능하 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.reader
고 with
문 함께.
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