본문 바로가기
정보

[python] 파이썬 파일 열기, 읽기 open 함수로 같은 파일 여러 번 열면 어떻게 되나요?

by 노마드 기록 2024. 11. 10.
반응형

 

 

python open 함수에 대한 간단한 설명

open()을 사용하여 이미 열려 있는 파일을 다시 열 경우, 새로운 파일 객체가 생성되며 이전 파일 객체와는 별개의 독립적인 파일 핸들로 작동합니다.

 

  1. 새로운 파일 객체 생성: 두 번째 open() 호출은 기존에 열려 있는 파일과는 무관하게 별도의 파일 객체를 생성합니다.
  2. 각 파일 객체의 독립성: 두 파일 객체는 서로 독립적이기 때문에 하나의 파일 객체에서 데이터를 읽거나 쓰더라도 다른 파일 객체에는 영향을 주지 않습니다.
  3. 파일 포인터 위치: 각 파일 객체는 독립적인 파일 포인터를 가지며, 파일 내에서의 읽기/쓰기 위치가 다를 수 있습니다.
  4. 모드와 충돌 가능성: 파일을 여는 모드에 따라 충돌이 발생할 수 있습니다. 예를 들어, 하나의 파일 객체가 쓰기 모드(w 또는 a)로 파일을 열어 쓰기를 하는 동안 다른 파일 객체가 읽기 모드로 열려 있으면 동기화 문제나 예기치 않은 동작이 발생할 수 있습니다.

 

파이썬 파일 열기

 

 

파일을 열 때 다양한 모드가 있죠? 

r : 읽기 모드

w : 쓰기 모드

a : 읽고 쓰기 모드

 

각각의 모드에서 어떻게 작동되는지 알려드리겠습니다.

 

 

open 쓰기 모드로 열었을 때 "w"

 

각 파일 객체(file1, file2)에 내용을 저장하는 경우, 동일한 파일을 두 번 열었더라도 독립적인 파일 핸들로 작동하기 때문에 동기화 문제나 예기치 않은 동작이 발생할 수 있습니다. 특히 파일을 다른 모드(w 또는 a 등)로 열어 쓰기를 하게 되면 다음과 같은 상황이 발생할 수 있습니다.

 

file1 = open("example.txt", "w")
file2 = open("example.txt", "w")

file1.write("Hello from file1\n")
file2.write("Hello from file2\n")

file1.close()
file2.close()

 

 

  • 덮어쓰기: w 모드로 파일을 열면 기존 내용을 모두 지우고 새로 작성하므로, file1이 쓰고 닫은 후 file2가 다시 쓰면 마지막에 file2가 작성한 내용만 남습니다. 즉, file2의 내용이 file1의 내용을 덮어쓰게 됩니다.
  • 병합되지 않음: 두 파일 객체의 쓰기 작업은 독립적이므로, 파일이 두 번 열려 각기 다른 내용이 쓰여도 마지막에 닫은 파일 객체의 내용만 남고, 병합되지 않습니다.
# example.txt 파일 내용은 아래와 같을 겁니다
Hello from file2\n

 


 

'a' 모드로 열어 파일에 쓰기

 

file1 = open("example.txt", "a")
file2 = open("example.txt", "a")

file1.write("Appending from file1\n")
file2.write("Appending from file2\n")

file1.close()
file2.close()

 

  • 추가 모드 (a)의 경우: a 모드로 파일을 열면 파일 끝에 내용을 추가하게 됩니다. 두 파일 객체가 모두 a 모드로 열려 있으면, 두 파일 객체에서 각각 내용을 추가할 때 파일 끝에 차례로 붙여 쓰는 방식이므로, 두 객체에서 쓴 내용이 순서대로 쌓일 수 있습니다. 다만, 이 경우에도 정확한 순서는 보장되지 않을 수 있습니다.

example.txt 파일의 결과는?

Appending from file1
Appending from file2

 

 


 

 

예시: r 모드로 파일을 두 번 열기

 
file1 = open("example.txt", "r")
file2 = open("example.txt", "r")

# file1과 file2에서 독립적으로 읽기 작업을 수행
print(file1.read())  # file1에서 파일 전체 읽기
print(file2.readline())  # file2에서 첫 번째 줄만 읽기

file1.close()
file2.close()

 

 

 

위 코드에서 file1.read()를 호출하면 파일의 전체 내용을 file1 객체로 읽어올 수 있고, file2.readline()을 호출하면 file2는 첫 번째 줄만 읽어옵니다. 두 파일 객체는 각각 독립적으로 작동하므로, 한쪽에서 읽더라도 다른 쪽에는 영향을 주지 않습니다.

 

각각에서 read 혹은 readline을 실행시켜도 독립적으로 작동된다는 것이 포인트입니다.

반응형