파이썬 파일 모드“w +”와 혼동


201

로부터 문서 ,

'r +', 'w +'및 'a +'모드는 업데이트 할 파일을 엽니 다 ( 'w +'는 파일을 자릅니다). 이진 파일과 텍스트 파일을 구분하는 시스템에서 이진 모드로 파일을 여는 모드에 'b'를 추가하십시오. 이러한 구분이없는 시스템에서는 'b'를 추가해도 아무런 영향이 없습니다.

그리고 여기

w + : 쓰기와 읽기를위한 파일을 엽니 다. 파일이 존재하면 기존 파일을 덮어 씁니다. 파일이 존재하지 않으면 읽고 쓸 새 파일을 작성하십시오.

그러나 파일을 읽는 방법은 w+무엇입니까?


27
다이어그램이 매우 유용하다는 것을 알았습니다 .
Ritwik

답변:


132

당신이 with해야 할 것과 같은 진술로 파일을 열고 있다고 가정 해 봅시다 . 그런 다음 파일에서 읽을 다음과 같은 작업을 수행하십시오.

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

참고 f.seek(0)- 당신이 잊어 버린 경우 f.read()호출은 파일의 끝에서 읽으려고하며, 빈 문자열을 반환합니다.


1
"0 바이트로 잘린다"는 무엇을 의미합니까?
Nasif Imtiaz Ohi

22
@NasifImtiazOhi-파이썬 문서 w+는 "파일이 존재하면 기존 파일을 덮어 씁니다" 라고 말합니다 . 로 파일을 열면 w+이제 빈 파일이됩니다. 0 바이트를 포함합니다. 데이터가 포함 된 경우 해당 데이터는 잘려서 잘려서 버려졌으며 이제 파일 크기는 0 바이트이므로를 사용 하여 파일을 열기 전에 존재했던 데이터를 읽을 수 없습니다 w+. 실제로 이전 데이터를 읽고 추가하려면 r+대신을 사용해야 합니다 w+.
rmunn jan

새로운 데이터를 추가하는 방법?
Beqa Bukhradze

1
@BeqaBukhradze-질문이 있으시면 "질문하기"버튼을 클릭하십시오. 여기에서 수백 명의 사람들이 볼 수 있습니다. 한두 사람 만 볼 수있는 "댓글 추가"버튼을 클릭하지 마십시오.
rmunn

430

다음은 파일을 여는 다양한 모드 목록입니다.

  • 아르 자형

    읽기 전용으로 파일을 엽니 다. 파일 포인터는 파일의 시작 부분에 있습니다. 이것이 기본 모드입니다.

  • rb

    이진 형식으로 만 읽을 수 있도록 파일을 엽니 다. 파일 포인터는 파일의 시작 부분에 있습니다. 이것이 기본 모드입니다.

  • r +

    읽고 쓸 수있는 파일을 엽니 다. 파일 포인터는 파일의 시작 부분에 있습니다.

  • rb +

    이진 형식으로 읽고 쓸 수있는 파일을 엽니 다. 파일 포인터는 파일의 시작 부분에 있습니다.

  • 쓰기 전용으로 파일을 엽니 다. 파일이 존재하면 파일을 덮어 씁니다. 파일이 존재하지 않으면 새 파일을 작성합니다.

  • wb

    이진 형식으로 만 쓸 파일을 엽니 다. 파일이 존재하면 파일을 덮어 씁니다. 파일이 존재하지 않으면 새 파일을 작성합니다.

  • w +

    쓰기와 읽기를위한 파일을 엽니 다. 파일이 존재하면 기존 파일을 덮어 씁니다. 파일이 존재하지 않으면 읽고 쓸 새 파일을 작성하십시오.

  • wb +

    이진 형식으로 읽고 쓸 수있는 파일을 엽니 다. 파일이 존재하면 기존 파일을 덮어 씁니다. 파일이 존재하지 않으면 읽고 쓸 새 파일을 작성하십시오.

  • 추가 할 파일을 엽니 다. 파일이 존재하면 파일 포인터는 파일의 끝에 있습니다. 즉, 파일이 추가 모드에 있습니다. 파일이 존재하지 않으면 새 파일을 작성합니다.

  • ab

    이진 형식으로 추가 할 파일을 엽니 다. 파일이 존재하면 파일 포인터는 파일의 끝에 있습니다. 즉, 파일이 추가 모드에 있습니다. 파일이 존재하지 않으면 새 파일을 작성합니다.

  • a +

    추가하고 읽을 파일을 엽니 다. 파일이 존재하면 파일 포인터는 파일의 끝에 있습니다. 추가 모드에서 파일이 열립니다. 파일이 존재하지 않으면 읽고 쓸 새 파일을 작성합니다.

  • ab +

    이진 형식으로 추가하고 읽을 수있는 파일을 엽니 다. 파일이 존재하면 파일 포인터는 파일의 끝에 있습니다. 추가 모드에서 파일이 열립니다. 파일이 존재하지 않으면 읽고 쓸 새 파일을 작성합니다.


모든 집중적 인 목적으로 r +와 w +는 동일합니까?
Nick Humrich

21
@Humdinger : 아니요, w+새 파일을 만들거나 기존 파일을 자른 다음 읽고 쓰기 위해 엽니 다. r+읽고 쓰기 위해 파일을 자르지 않고 기존 파일을 엽니 다. 매우 다릅니다.
abarnert

또한 @AlokAgarwal의 답변과 마찬가지로 이것은 완전한 모드 목록이라고 주장하지만 그렇지 않습니다.
abarnert

1
여러 매개 변수가있는 함수처럼 작동하므로 철저한 모드 목록을 제공하는 것은 다소 어리석은 일입니다. r, w또는 a독점적이지만 b할 수있는 것처럼 추가 할 수 있습니다 +. 또는 U... 조합 폭발입니다.
rmunn

4
rb기본 모드가 아닙니다 따옴표 : The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
iggy

158

파이썬의 모든 파일 모드

  • r 독서
  • r+ 읽고 쓰기 위해 열립니다 (파일을자를 수 없습니다)
  • w 쓰기
  • w+ 쓰기 및 읽기 용 (파일 자르기 가능)
  • rb이진 파일을 읽는 데 사용됩니다. 파일 포인터는 파일의 시작 부분에 있습니다.
  • rb+ 이진 파일 읽기 또는 쓰기
  • wb+ 이진 파일 작성
  • a+ 추가를 위해 열린다
  • ab+이진으로 추가하고 읽을 수있는 파일을 엽니 다. 파일이 존재하면 파일 포인터는 파일의 끝에 있습니다. 추가 모드에서 파일이 열립니다.
  • x 파일이 이미 존재하는 경우 독점 생성을 위해 열기 (Python 3)

5
이것은 모든 모드가 아닙니다. 그것은 예를 들어, 무시, rb그리고 wb언급하지 않는, U2.X에서 모드와 t(모두 모두 제외와 결합 될 수있다 3.X에서 모드 b).
abarnert

1
r +와 w +의 차이점은 w +는 파일을 열 때 파일을 자릅니다. 그러나 두 모드에서 수동으로자를 수 있습니다.
Martin

1
이 대답은 @ 200에서 지정한 것과 일치하지 않습니다. 예를 들어 wb+파일에서 읽습니까?
Celeritas

@Celeritas wb는 파일이 이진 모드로 쓰기 위해 열려 있음을 나타냅니다. Unix 시스템 (Linux, Mac OS X 등)에서 이진 모드는 아무 작업도 수행하지 않습니다. 다른 파일을 처리하는 것과 같은 방식으로 텍스트 파일을 처리합니다. 그러나 Windows에서는 텍스트 파일이 약간 수정 된 줄 끝으로 작성됩니다. exe 또는 jpg 파일과 같은 실제 이진 파일을 처리 할 때 심각한 문제가 발생합니다. 따라서 유닉스에서도 텍스트가 아닌 파일을 열 때 wb 또는 rb를 사용해야합니다. 텍스트 파일에만 일반 w 또는 r을 사용하십시오.
Alok Agarwal

Python 3에는 'x'열기 모드도 있습니다. 독점적 인 제작을 위해 열려 파일이 이미 존재하지 않으면 실패합니다. 문서에서 열린 기능을 참조하십시오 .
Laurent LAPORTE

9

r 읽다

w 쓰기

r+ 파일이 존재하는 경우 원본 컨텐츠를 삭제하지 않고 읽기 / 쓰기 용, 그렇지 않으면 예외 발생

w+ 원본 내용을 삭제 한 다음 파일이 있으면 읽기 / 쓰기, 그렇지 않으면 파일을 만듭니다.

예를 들어

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'
>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$

2

파일이 잘 리므로 호출 할 수 있습니다read() ( 'w'를 사용하여 열 때와 달리 예외는 발생하지 않음). 빈 문자열이 나타납니다.


2

나는 당신이 달성하려고 생각하는 것을 처리하는 두 가지 방법이 있다고 생각합니다.

1) 분명한 것은 읽기 전용 파일을 열고 메모리로 읽은 다음 t로 파일을 연 다음 변경 사항을 작성하는 것입니다.

2) 낮은 수준의 파일 처리 루틴을 사용하십시오.

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

도움이 되었기를 바랍니다..


그렇다면 무엇을 위해 r+
SmartManoj

1

사실, r+모드 에 대한 다른 모든 대답에는 잘못된 것이 있습니다.

test.in 파일 내용 :

hello1
ok2
byebye3

그리고 py 스크립트의 :

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

실행하면 test.in의 내용이 다음과 같이 변경됩니다.

hello1
ok2
byebye3
addition

그러나 스크립트를 다음과 같이 수정하면

with open("test.in", 'r+')as f:
    f.write("addition")

test.in또한 응답을 수행합니다

additionk2
byebye3

따라서이 r+모드에서는 읽기 작업을 수행하지 않은 경우 처음부터 내용을 다룰 수 있습니다. 그리고 우리가 읽기 작업 f.write()을 수행하면 파일에 추가됩니다.

그건 그렇고, 우리가 f.seek(0,0)전에 f.write(write_content)라면 write_content는 positon (0,0)에서 그것들을 덮을 것입니다.


0

h4z3 에서 언급했듯이 실제 사용을 위해 데이터가 너무 커서 모든 것을 직접로드하거나 생성기 또는 실시간 수신 데이터가있는 경우 w +를 사용하여 파일에 저장하고 나중에 읽을 수 있습니다.

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