읽고 쓰기 위해 파일을 여는 방법은 무엇입니까?


210

읽고 쓰기 위해 파일을 여는 방법이 있습니까?

해결 방법으로 파일을 쓰기 위해 열고 닫은 다음 다시 읽기 위해 엽니 다. 그러나에 대한 파일을 열 수있는 방법이 모두 읽기와 쓰기는?


3
어떤 문제를 해결하고 있습니까? 파일을 쓰거나 읽는 것보다 더 나은 해결책이있을 수 있습니다. 예 :mmap
Roman Bodnarchuk

1
답변을 드릴 수 있도록 코드를 제공해 주시겠습니까? docs.python.org/tutorial/…을 살펴볼 수도 있습니다. 그러나 r + b를 사용하려고 시도했지만 작동합니다. diff 함수에서 하나의 파일 디스크립터를 사용하면 이점이 있습니까?
Artsiom Rudzenka

@RomanBodnarchuk mmap는 좋은 생각이지만 동시성을 다루어야한다면 어떻게해야합니까? 액세스를 예약 할 수있는 방법이 있습니까?
Dr_Zaszuś

답변:


267

파일을 읽고 다시 열지 않고 파일을 읽은 다음 기존 데이터를 덮어 쓰는 방법은 다음과 같습니다.

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()

41
사용하는 a+파일이 존재하지 않는 (생성됩니다) 커버 최종 경우에
Jossef Harush

16
seek ()와 truncate ()는 모두 중요합니다!
smwikipedia

4
@JossefHarush a상태에 대한 문서는 '일부 Unix 시스템에서 모든 쓰기가 현재 탐색 위치에 관계없이 파일 끝에 추가됨 '을 의미합니다. 이 경우 f.seek(0)예상대로 작동하지 않습니다. 나는 리눅스에서 이것을 파울했다.
Graeme

6
그것은 당신이 설명하는 더 나은 이유 seektruncate여기에 사용됩니다. 대부분의 독자는 Google에서 왔으며 복사하여 붙여 넣기를 수행합니다.
Shiplu Mokaddim

8
파일을 읽은 후 파일 포인터 (fp)가 앞으로 이동 했으므로 파일을 처음으로 설정해야합니다. 즉 seek(0), fp를 위치 0( 시작)에 배치합니다. truncate()제공된 바이트 수로 파일을 자릅니다. , 지정된 바이트 수 다음의 모든 파일 내용을 제거합니다. 파일에 문자열이 Hello, world있고 작성 한다고 상상해보십시오 Bye. 파일에 존재하는 텍스트를 삭제하지 않았기 때문에 truncate()마지막에 내용 이 없으면 Byelo, world입니다. truncate()파일을 현재 fp로 자릅니다.
Illya Gerasymchuk

48

r+동시에 읽고 쓰는 표준 모드입니다. / 는이 운영 체제 호출을 둘러싼 작은 래퍼 fopen()이므로 시스템 호출 을 사용하는 것과 다르지 않습니다 .file()open()


처음부터 쓰지 않고 파일 내용을 추가합니다.
TomSawyer

47

I / O 동작 요약

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

그리고 결정 지점

여기에 이미지 설명을 입력하십시오


트리 다이어그램을 작성하기 위해 어떤 소프트웨어를 사용 했습니까?
Flux

나도 관심이 있어요-Dia?
nerdoc

22

나는 이와 같은 것을 시도했으며 예상대로 작동합니다.

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

어디:

f.read (size)-파일의 내용을 읽으려면, f.read (size)를 호출하십시오.이 함수는 일정량의 데이터를 읽고이를 문자열로 반환합니다.

과:

f.write (string)은 문자열의 내용을 파일에 기록하고 None을 반환합니다.

또한 파일 읽기 및 쓰기에 대한 Python 자습서 를 열면 다음을 찾을 수 있습니다.

'r +'는 읽고 쓸 수있는 파일을 엽니 다.

Windows에서 모드에 추가 된 'b'는 파일을 이진 모드로 열리므로 'rb', 'wb'및 'r + b'와 같은 모드도 있습니다.


5
또한 'r + b'모드를 사용하면 읽기와 쓰기가 동일하게 작동하지만 f.read ()와 f.write () 사이에 f.seek (0)을 사용하여 커서를 파일의 시작 부분에 다시 배치해야합니다.
gaborous

2
작성중인 데이터가 더 이상 이미 존재하는 데이터가 아닌 경우 잘리지 않습니다. 이 truncate방법을 사용하여 이를 중지하십시오.
Flimm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.