2013-03-21 2 views
1

다음 코드를 고려하십시오 :이 코드 유휴는 RB에 새 파일을 엽니 다 실행할 때파일을 여는 방법을 지정할 수없는 이유는 무엇입니까?

try: 
    f = open("myfile2.dat", "rb") 
except IOError: 
    f = open("myfile2.dat", "ab+") 
print(f.mode) 
f.close() 

myfile2.dat이 존재하지 않는 경우를 +하지 AB +, 왜?

+0

출력은 어떻게됩니까? –

+1

myfile2.dat 파일을 삭제하지 않고 코드를 두 번 실행 했습니까? –

답변

4

파일을 추가 + 쓰기 모드로 여는 중입니다. 에 추가 할 파일이 없으므로 대신 읽기 + 쓰기 모드가됩니다.

이것은 입니다. 본질적으로는입니다. 여기에 아무런 문제가 없습니다, 당신은 여전히 ​​에서 파일에 쓸 수 있습니다.

파일에서 계속 파일이 추가 모드로 열리지 만 .mode 특성은 파일에 대한보다 단순한보기를 제공합니다. 단순히 파일 을 사용하여 수행 할 수있는 작업을보고합니다. 파일을 열 때 발생한 상황은 아닙니다. 파일을 읽거나 쓸 수 있고 독점적으로 생성하기 위해 파일을 연 경우에만 표시됩니다 (x 모드).

C code for the .mode attribute을 참조하십시오.

업데이트 : 예, 혼란스럽고 정말 버그입니다. path to fix this discrepancy은 최근에 Python으로 병합되었으며 Python 2.7, 3.3 및 3.4의 새로운 릴리스에서 파일 객체가 나오면 .mode 속성이 파일을 여는 데 사용 된 원래 모드 문자열을 더 잘 반영합니다.

+0

"추가"모드에서 열기의 의미는 운영 체제마다 다를 수 있습니다. 많은 사람들은'r +'모드로 열어 파일 바로 끝까지 찾아가는 것과 똑같이 취급합니다. 단지 소수의 OS만이 다르게 취급합니다. 모든 기록은 끝까지 강제됩니다. – Blckknght

+0

물론, 파일이 존재하지 않을 때'ab +'모드는 * only *로 사용됩니다; 그래서 파일은 항상 * 비어 있습니다. 따라서 *에 *를 붙일 이전 데이터가 없으며'r +'를 사용하면 여기에서 완벽하게 정확합니다. –

+0

요점은 일부 OS는 다른 위치를 찾더라도 항상 마지막에 쓰기 작업을 시행한다는 것입니다. 그래서''foo ''라고 쓰고, 파일의 시작 부분을 찾아서''bar''라고 쓰면, 파일에''bar ''가 있거나 OS에 따라''foobar "'가있을 수 있습니다. 이 동작이 매우 드물기 때문에, 당신과 질문자 모두'a + '가'r +'(seek와 함께)와 동일한 OS에 있다면 놀라지 않을 것입니다. 그러나 나는 항상 그런 것은 아닙니다. 경우. – Blckknght

0

편집 :이 작업은 파이썬 2.x에서 수행되었지만 원래 질문에서 # python-3.x 태그를 보지 못했습니다.

그것은 나를 위해 AB +를 열 :

>>> try: 
...  f = open("myfile2.dat", "rb") 
... except IOError: 
...  f = open("myfile2.dat", "ab+") 
... 
>>> print(f.mode) 
ab+ 

이 Mac에서 자이 썬을 실행 중입니다.

+0

그건 파이썬 3만큼 멀리 있지 않습니다. –

+0

명시 적으로 : 나는 OP가 파이썬 3.3에서 보는 것을 재현 할 수있다; I/O 처리는 파이썬 3을 위해 완전히 정비되었다. –

+0

@mistermarko : 아니, 내가 본 것을 재현했다. 문제가되지 않는다. –

관련 문제