다음 코드를 고려하십시오 :이 코드 유휴는 RB에 새 파일을 엽니 다 실행할 때파일을 여는 방법을 지정할 수없는 이유는 무엇입니까?
try:
f = open("myfile2.dat", "rb")
except IOError:
f = open("myfile2.dat", "ab+")
print(f.mode)
f.close()
myfile2.dat이 존재하지 않는 경우를 +하지 AB +, 왜?
다음 코드를 고려하십시오 :이 코드 유휴는 RB에 새 파일을 엽니 다 실행할 때파일을 여는 방법을 지정할 수없는 이유는 무엇입니까?
try:
f = open("myfile2.dat", "rb")
except IOError:
f = open("myfile2.dat", "ab+")
print(f.mode)
f.close()
myfile2.dat이 존재하지 않는 경우를 +하지 AB +, 왜?
새 파일을 추가 + 쓰기 모드로 여는 중입니다. 을에 추가 할 파일이 없으므로 대신 읽기 + 쓰기 모드가됩니다.
이것은 입니다. 본질적으로는입니다. 여기에 아무런 문제가 없습니다, 당신은 여전히 과에서 파일에 쓸 수 있습니다.
파일에서 계속 파일이 추가 모드로 열리지 만 .mode
특성은 파일에 대한보다 단순한보기를 제공합니다. 단순히 파일 을 사용하여 수행 할 수있는 작업을보고합니다. 파일을 열 때 발생한 상황은 아닙니다. 파일을 읽거나 쓸 수 있고 독점적으로 생성하기 위해 파일을 연 경우에만 표시됩니다 (x
모드).
C code for the .mode
attribute을 참조하십시오.
업데이트 : 예, 혼란스럽고 정말 버그입니다. path to fix this discrepancy은 최근에 Python으로 병합되었으며 Python 2.7, 3.3 및 3.4의 새로운 릴리스에서 파일 객체가 나오면 .mode
속성이 파일을 여는 데 사용 된 원래 모드 문자열을 더 잘 반영합니다.
"추가"모드에서 열기의 의미는 운영 체제마다 다를 수 있습니다. 많은 사람들은'r +'모드로 열어 파일 바로 끝까지 찾아가는 것과 똑같이 취급합니다. 단지 소수의 OS만이 다르게 취급합니다. 모든 기록은 끝까지 강제됩니다. – Blckknght
물론, 파일이 존재하지 않을 때'ab +'모드는 * only *로 사용됩니다; 그래서 파일은 항상 * 비어 있습니다. 따라서 *에 *를 붙일 이전 데이터가 없으며'r +'를 사용하면 여기에서 완벽하게 정확합니다. –
요점은 일부 OS는 다른 위치를 찾더라도 항상 마지막에 쓰기 작업을 시행한다는 것입니다. 그래서''foo ''라고 쓰고, 파일의 시작 부분을 찾아서''bar''라고 쓰면, 파일에''bar ''가 있거나 OS에 따라''foobar "'가있을 수 있습니다. 이 동작이 매우 드물기 때문에, 당신과 질문자 모두'a + '가'r +'(seek와 함께)와 동일한 OS에 있다면 놀라지 않을 것입니다. 그러나 나는 항상 그런 것은 아닙니다. 경우. – Blckknght
편집 :이 작업은 파이썬 2.x에서 수행되었지만 원래 질문에서 # python-3.x 태그를 보지 못했습니다.
그것은 나를 위해 AB +를 열 :>>> try:
... f = open("myfile2.dat", "rb")
... except IOError:
... f = open("myfile2.dat", "ab+")
...
>>> print(f.mode)
ab+
이 Mac에서 자이 썬을 실행 중입니다.
그건 파이썬 3만큼 멀리 있지 않습니다. –
명시 적으로 : 나는 OP가 파이썬 3.3에서 보는 것을 재현 할 수있다; I/O 처리는 파이썬 3을 위해 완전히 정비되었다. –
@mistermarko : 아니, 내가 본 것을 재현했다. 문제가되지 않는다. –
출력은 어떻게됩니까? –
myfile2.dat 파일을 삭제하지 않고 코드를 두 번 실행 했습니까? –