내장 된 개방 기능에서 모드 a, a +, w, w + 및 r +의 차이점은 무엇입니까?


608

내장 파이썬에서 열린 기능, 모드 사이의 정확한 차이는 무엇인가 w, a, w+, a+, 그리고 r+?

특히,이 문서는 이들 모두가 파일에 쓸 수 있음을 의미하며, "추가", "쓰기"및 "업데이트"를 위해 파일을 열지 만이 용어의 의미를 정의하지는 않는다고 말합니다.


11
제공 한 링크는 값을 정확하게 정의합니다. 제공 한 링크 중 어떤 부분을 보거나 이해할 수 없었습니까? 링크에 대해 이해하지 못한 것을 설명하기 위해 질문을 명확히 할 수 있습니까?
S.Lott


2
+ 부호의 의미를 설명하는 단순하고 단일 한 문서가 없습니까?
Charlie Parker

답변:


740

오프닝 모드는 C 표준 라이브러리 기능과 동일합니다 fopen().

BSD fopen맨 페이지 는 다음과 같이 정의합니다.

 The argument mode points to a string beginning with one of the following
 sequences (Additional characters may follow these sequences.):

 ``r''   Open text file for reading.  The stream is positioned at the
         beginning of the file.

 ``r+''  Open for reading and writing.  The stream is positioned at the
         beginning of the file.

 ``w''   Truncate file to zero length or create text file for writing.
         The stream is positioned at the beginning of the file.

 ``w+''  Open for reading and writing.  The file is created if it does not
         exist, otherwise it is truncated.  The stream is positioned at
         the beginning of the file.

 ``a''   Open for writing.  The file is created if it does not exist.  The
         stream is positioned at the end of the file.  Subsequent writes
         to the file will always end up at the then current end of file,
         irrespective of any intervening fseek(3) or similar.

 ``a+''  Open for reading and writing.  The file is created if it does not
         exist.  The stream is positioned at the end of the file.  Subse-
         quent writes to the file will always end up at the then current
         end of file, irrespective of any intervening fseek(3) or similar.

3
C 표준 라이브러리 (시스템 호출이 아님)에서 열린 호출을 의미한다고 생각합니다.
Eli Courtwright

14
참고 : Python v3에는 여러 가지 추가 모드가 추가되었습니다. 문서 링크
Alex

5
주목 w하고 w+모두가 할 수있는The file is created if it does not exist
웨이 양

4
Windows의 경우, b모드에 추가 바이너리 모드로 파일을 엽니 다, 그래서 같은 모드도 있습니다 rb, wb하고 r+b. Windows의 Python은 텍스트 파일과 이진 파일을 구분합니다. 텍스트 파일의 줄 끝 문자는 데이터를 읽거나 쓸 때 자동으로 약간 변경됩니다.

6
나는 바로이 말을하고 +이 경우 어떤 일관된 독립을하지 않는 a, w또는 r? 아니면 패턴을 보지 못합니까? 패턴은 무엇입니까?
Charlie Parker

509

나는 매번 모드 사이의 주요 차이점이 무엇인지에 대한 정신적 인 이미지를 만들기 위해 Google을 다시 열어야한다는 것을 알았습니다. 그래서 다음에 다이어그램을 읽는 것이 더 빠를 것이라고 생각했습니다. 다른 사람도 도움이 될 것입니다.


3
a설명은 잘못 . 쓰기는 항상 끝에 위치합니다.
Antti Haapala

10
@ 그리고 나는 @Antti가 Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similar단지 초기 위치가 끝 이라고 말하는 것보다 다소 강한 재산 을 언급하고 있다고 생각 합니다.
jcai

8
@CharlieParker 기본적으로 두 가지 파일 작업 (읽기, 쓰기)이 있습니다. 모드 r은 주로 읽기 모드이다 w , a가 쓰기 위해 주로이다. 그리고 더하기 부호는 주어진 모드에 대한 두 번째 작업가능하게 합니다 (간단히 말하면).
Jeyekomon

22
후손의 경우 : 잘라내 기는 처음부터 덮어 쓰는 것을 의미합니다.
Minh Tran

4
@Jeyekomon 귀하의 의견에 대한 귀하의 의견은 아마도 지금 내가 기억할 수있는 방식 으로이 모드를 둘러 볼 때 읽은 가장 도움이되는 것 일 것입니다! 이 답변의 순서도는 아름답고 아래 답변의 표는 훌륭하지만이 답변 (및 다른 곳) 이이 간단한 점으로 시작하여 거기에서 작동하면 세부 사항을 걸 수있는 훨씬 나은 정신적 틀을 제공하는 데 도움이됩니다 의 위에. 감사합니다. (이것은 스팸의 경계에 있음을 알고 있지만 귀하의 의견은 인정받을 가치가 있다고 느꼈습니다) 💯
Tim

206

테이블 형식으로 된 동일한 정보

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

의미는 다음과 같습니다 (오해를 피하기 위해)

  • 읽기-파일에서 읽기가 허용됩니다
  • 쓰기-파일 쓰기가 허용됩니다

  • create-파일이 없으면 작성됩니다.

  • 잘림-파일을 여는 동안 파일이 비워집니다 (파일의 모든 내용이 지워짐)

  • 시작 위치-파일을 연 후 초기 위치는 파일 시작으로 설정됩니다.

  • 끝 위치-파일을 연 후 초기 위치는 파일 끝으로 설정됩니다.

참고 : aa+항상 파일의 끝에 추가 - 모든 무시 seek움직임을.
BTW. a+모드 에서 열린 새 파일의 경우 적어도 내 win7 / python2.7에서 재미있는 동작 :
write('aa'); seek(0, 0); read(1); write('b')-초 write는 무시됩니다
write('aa'); seek(0, 0); read(2); write('b')-두 번째 write인상IOError


10
"파일이 존재하지 않는 경우 파일 작성. 존재하지 않는 경우 시작 위치, 읽기 및 쓰기 활성화"가없는 이유는 무엇입니까? 이것은 나를위한 가장 확실한 유스 케이스입니다. 파일에 데이터를 저장하고 있습니다. 파일이 없으면 오류 대신 파일을 작성하십시오. 파일에 데이터가있는 경우 맨 위에서 모든 데이터를 읽으려면 일부 내용을 업데이트 한 다음로드 할 다음 시간 동안 0에서 파일을 완전히 다시 씁니다. 나는 open(file,'a'); close(); open(file,'r+')이것을 달성 하기 위해 사용합니다.
pinhead

2
이 문맥에서 "잘라 내기"는 무엇을 의미합니까?
Charlie Parker

3
@CharlieParker 파일의 모든 내용이 지워짐을 의미합니다 (파일이 비어 있음)
industryworker3595112

1
을 사용하여 포인터를 수동으로 이동하는지 여부에 관계없이 파일 끝에서 with aa+write가 항상 발생 한다는 메모를 추가 할 수 있습니다 seek().
balu

1
Python 3에 'x'를 포함하도록 테이블을 업데이트하는 것은 어떻습니까?
Nikos Alexandris

39

옵션은 C 표준 라이브러리 의 fopen 함수 와 동일 합니다.

w 파일을 잘라내어 이미 있던 내용을 덮어 씁니다.

a 파일에 추가하여 이미 존재하는 모든 것을 추가합니다.

w+ 읽고 쓰기 위해 파일을 자르면서 파일에 쓰여진 내용을 다시 읽을 수 있도록 엽니 다

a+ 파일을 추가하고 내용을 읽을 수 있도록 추가 및 읽기를 위해 열립니다.


2
이 문맥에서 "잘라 내기"는 무엇을 의미합니까? 오래된 데이터가 있다면 오래된 데이터를 삭제한다는 의미입니까? 아니면 다른 더 구체적인?
Charlie Parker

3
@CharlieParker : 맞습니다. 기존 파일의 모든 데이터가 삭제되고 비어있는 파일의 처음부터 쓰기 시작 함을 의미합니다.
Eli Courtwright

9

나는 이것이 플랫폼 간 실행, 즉 CYA와 같이 고려하는 것이 중요하다고 생각합니다. :)

Windows에서 모드에 추가 된 'b'는 파일을 이진 모드로 열리므로 'rb', 'wb'및 'r + b'와 같은 모드도 있습니다. Windows의 Python은 텍스트 파일과 이진 파일을 구분합니다. 텍스트 파일의 줄 끝 문자는 데이터를 읽거나 쓸 때 자동으로 약간 변경됩니다. 파일 데이터에 대한 이러한 비하인드 수정은 ASCII 텍스트 파일에 적합하지만 JPEG 또는 EXE 파일에서와 같은 이진 데이터를 손상시킵니다. 이러한 파일을 읽고 쓸 때 바이너리 모드를 사용하도록주의하십시오. 유닉스에서는 'b'를 모드에 추가하는 것이 아프지 않으므로 모든 바이너리 파일에 대해 플랫폼 독립적으로 사용할 수 있습니다.

이것은 Python Software Foundation 2.7.x 에서 직접 인용되었습니다 .


9

왜 'w +'대 'w'모드를 사용하는지 알아 내려고 노력했습니다. 결국, 나는 약간의 테스트를했다. 두 가지 경우 모두 파일이 잘 리기 때문에 'w +'모드의 목적이별로 보이지 않습니다. 그러나 'w +'를 사용하면 다시 검색하여 글을 읽은 후 읽을 수 있습니다. 'w'를 사용하여 읽기를 시도하면 IOError가 발생합니다. 'w +'모드에서 탐색을 사용하지 않고 읽는 것은 파일 포인터가 작성한 위치를 따르기 때문에 아무 것도 산출하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.