2014-12-26 1 views
-3

이 간단한 코드예외가

# This code will BLANK the file 'myfile'! 
with open('myfile', 'w') as file: 
    raise Exception() 

를 작성하는 것이 아니라 단지 예외를 던지는 열려있는 파일, 은 "myfile을"의 모든 데이터를 실제 쓰기 작업도 시도되지 않지만을 삭제합니다.

이렇게 말하면 위험하고 다른 언어가 그러한 상황을 어떻게 대처하는지는 분명하지 않습니다.

어떻게 예방할 수 있습니까? 예기치 않은 상황에 의해 대상 파일이 지워지지 않도록 가능한 모든 예외를 처리해야합니까? 확실히이 문제를 해결하기위한 표준 패턴이 있어야합니다. 그리고 무엇보다 : 처음에 여기서 무엇이 일어나고 있습니까?

+0

"w"또는 "쓰기"모드가 기본적으로 파일을 먼저 자르기 때문입니다. 이것은 "open (..)"이 일어나는 시간에 이루어집니다. – SuperSaiyan

+0

내가 쓰는 언어에 상관없이 글을 쓸 때 모든 언어가 기본적으로 파일을 잘라 버린다는 것은 틀린 말입니다. –

+0

이 동작은 Python과 아무런 관련이 없습니다. 이것은 POSIX/Unix/Linux, OS X 및 Windows에서의'open' 시스템 호출의 정의 된 의미입니다. 파이썬에서이 동작을 변경하려면 OS 레벨에서 [Os.PHEN] (http://linux.die.net/man/2/open)을 사용하여 'O_TRUNC' 상수를 특별히 생략해야합니다. *방법*. – msw

답변

2

쓰기 용으로 파일을 여는 중입니다. 은 파일을 공백으로 두는 간단한 작업입니다. open() function documentation에서 : 먼저 파일

강조 광산을 절단 쓰기 위해 열려

'w'
, . 본질적으로, 파일을 열지 않았기 때문에 파일을 쓰지 않았기 때문에 파일이 비어 있습니다.

이 문제가 발생하지 않도록하려면 실제로 쓸 데이터가있는 지점으로 파일을 연기하십시오. 파일 목록에 문자열 목록을 쓰는 것은 파이썬 수준 인에서 예외를 발생시키지 않습니다. .

또는 파일에 쓰고 나중에 이름을 바꾸고 (이동) 원본을 바꿉니다. 파일 이름을 OS의 왼쪽으로 변경합니다.

+0

그리고 쓸 데이터가 있지만 쓰는 동안 오류가 발생합니까? – user4395564

+0

@ user4395564 : 파일을 이미 비운 상태입니다. 데이터를 작성할 준비가 되었다면, 적어도 예외는 파이썬 프로그램에 의해 발생하지 않을 것입니다; 남아있는 것은 조기 종료 (프로그램 또는 기계) 또는 디스크 관련 문제 (더 이상의 디스크 공간 없음 등)입니다. –

0

파일을 잘라 실행 즉 모든 내용을 삭제합니다 open('myfile', 'w') 문.

라인을 유지하려면 사용하고자하는 라인을 open('myfile', 'a')으로 지정하십시오. 여기서 a 옵션은 append입니다.

+0

그러나 예외가 발생하지 않으면 OP는 * 정보를 대체 *하지 않습니다. –

+0

@MartijnPieters OP가 '열린'통화 후에 OP가하고 싶어하는 것에 관해서는 조금 불분명하지 않다. –

+0

아니요, 그러나 추가는 매우 다른 종류의 작업입니다. 새 파일에 쓰고 OS에서 이전 파일을 바꾸는 것이 좋습니다. –

0

쓰기 위해 파일을 열면 내용이 지워집니다. 데이터가 손실되는 것을 피하는 가장 좋은 방법은 예외가 발생했을 때뿐만 아니라 컴퓨터를 종료 할 때도 새로운 임시 파일을 만들고 모든 것이 완료되면 원래 이름으로 파일 이름을 바꾸는 것입니다.

yourfile = "myfile" 
try: 
    with tempfile.NamedTemporaryFile(dir=os.path.dirname(yourfile) or '.', delete=False) as output: 
     do_something() 
except Exception: 
    handle_exception() 
else: 
    os.rename(output.name, yourfile)