2017-11-30 21 views
0

는의 아래 완성도 예를 위해, 문자열을 변환 foo 기능을 살펴 보자 :동일한 with 절에서 2 개의 컨텍스트 관리자를 사용하여 파일을 현재 위치에서 수정하는 것이 안전합니까?

def foo(data): 
    ### processes data in a fancy way ### 
    return data.lower() # :P 

가이 같은 자리에서 파일을 수정하는 전형적인 패턴을 대체하는 좋은 생각이 될 것입니다 경우 궁금 해서요 이 다른 하나

# snippet1 
with open(path, "r") as f: 
    out = foo(f.read()) 

with open(path, "w") as f: 
    f.write(out) 

:

# snippet2 
with open(path, "r") as f1: 
    out = foo(f1.read()) 
    with open(path, "w") as f2: 
     f2.write(out) 

이 가능한 모든 시나리오에서 할 안전합니까?

관련 정보 https://www.python.org/dev/peps/pep-0343/

+0

컨텍스트 관리자가이 시나리오와 관련이 있다고 생각하지 않습니다. 문제는 단일 파일에 두 개의 핸들이있는 것입니다. – BartoszKP

답변

0

이 컨텍스트 매니저와 문제가되지 않습니다. 두 개의 컨텍스트 관리자가 정상적으로 작동합니다! 문제는 여기에 있습니다 :

open("path", "w") 

쓰기 위해 열면 파일이 잘립니다. 즉, 모든 데이터가 삭제됩니다. 나중에 읽으면 파일이 비어 있음을 알 수 있습니다.

두 단계로 수행해야합니다.

+0

내 질문을 편집했습니다. 이전에 유감스럽게 생각합니다. 그 경우는 어리 석고 관련성이 없으며, 나쁘다고 생각합니다. P – BPL

+0

@BPL : 편집 후에 Windows에서 작동하는지 잘 모르겠습니다. 하지만 필자는 테스트 할 Windows 시스템이 없습니다. –