[Python] 파이썬 파일 입출력(파일 생성, 읽기, 쓰기, 이어쓰기) 총정리
- Language/Python
- 2023. 11. 12.
프로그래밍에서 유의미한 데이터가 생성되었다면 이것을 어딘가에 기록해두어야 합니다. DB를 사용하면 가장 좋겠지만 간단한 데이터들은 DB를 사용하지 않고 파일 형태(ex : txt 파일)로 어딘가에 저장해 뒀다가 사용할 수도 있겠죠. 이번 포스팅에서는 파이썬에서 파일 입출력 하는 방법에 대해 알아보도록 하겠습니다.
※ 파일 입출력이란 로컬 파일의 데이터를 읽거나 반대로 파일에 데이터를 쓰는 작업을 뜻하며 쉽게 메모장이나 바이너리 파일에 텍스트를 넣거나 불러오는 과정을 뜻한다고 생각하시면 되겠습니다.
파일 열기와 닫기(open, close)
# 파일 열기
# 변수명 = open("파일경로/파일이름.txt", "모드")
new_file = open("sample.txt", "w")
# 파일 닫기
new_file.close()
먼저 파일을 사용하기 위해서는 파일 열어줘야하고, 사용이 끝났다면 파일을 닫아주어야 합니다. 이 과정을 위해 파이썬에서는 open()와 close() 메서드를 제공하는데요. 파일을 열 때는 open() 함수를 사용하며, 파일 경로와 모드를 지정해야 합니다. 모드는 파일을 쓰기, 읽기, 또는 추가 모드로 열 것인지를 나타냅니다.
위의 예제처럼 w모드로 열면 신규 파일을 생성할 수 있습니다. 파일을 사용한 후에는 close() 메서드를 사용하여 파일을 닫아주면 됩니다.
※ 참고로 파일 open을 했다면 반드시 close를 진행해주셔야 합니다. 그렇지 않다면 계속 파일이 open되어 있는 상태로 자원을 차지하고 있어 수정한 파일이 반영이 안 되는 등의 오동작 소지가 있습니다.
파일 모드
모드 | 설명 |
r | 읽기 모드(디폴트) |
r+ | 읽기 + 쓰기 모드 |
w | 쓰기 모드 |
a | 쓰기 + 이어쓰기 모드 |
t | 텍스트 모드(디폴트) |
b | 바이너리 모드 |
파일모드는 파이썬에서 파일을 열 때 어떤 방식으로 열 것인지를 결정하는데 사용됩니다. 파일 모드의 옵션값은 위의 표를 참고해 주세요.
파일 읽기
read() : 파일을 읽습니다.
file = open("sample.txt", "r")
content = file.read()
print(content)
file.close()
파일에서 데이터를 가지고 오고 싶다면 파일을 읽어야 합니다. 파이썬에서 파일을 읽을 때는 파일을 r혹은 r+모드로 open한 뒤 read() 관련 메서드를 사용하면 되는데, 그중에서 가장 기본이 되는 read() 메서드는 파일 전체 데이터를 문자열로 반환해 줍니다. read(n) 형태로 인자값을 넣어서 문자 n개를 반환하게끔 할 수도 있습니다. 이때 파일이 큰 경우에는 전체 내용을 메모리에 로드하므로 메모리 사용에 주의하셔야 합니다.
※ 참고로 읽어야 하는 대상 파일이 없으면 에러가 발생하니 이점 주의하셔야 합니다.
readline() : 파일에서 한 줄씩 읽습니다.
file = open("sample.txt", "r")
line = file.readline()
while line:
print(line)
line = file.readline()
file.close()
파일의 데이터를 라인 단위로 가져오고 싶을 경우도 있을 것 같습니다. 그럴 때는 readline() 메서드를 사용하면 됩니다. readline()은 '\n' 개행 기준으로 데이터를 가져와서 문자열로 반환해 줍니다.
readlines() : 파일의 모든 라인을 각각의 문자열로 읽어 리스트로 반환합니다.
file = open("sample.txt", "r")
lines = file.readlines()
for line in lines:
print(line)
file.close()
파일의 모든 라인을 읽은 뒤 리스트로 반환해 주는 함수도 있습니다. readlines()를 사용하면 파일의 각 라인은 문자열 형태로 리스트 요소에 저장됩니다.
파일 쓰기
write(): 파일에 내용을 씁니다.
file = open("sample.txt", "w")
file.write("파일에 작성할 문자열")
file.close()
파일에 문자열을 쓸 때는 파일을 r+나 w모드로 open한 뒤 write() 메서드를 사용하면 됩니다. 이때 기존 내용을 덮어쓰므로 주의가 필요합니다. 만약 파일이 없다면 파일을 생성합니다.
writelines(): 리스트의 문자열 요소들을 파일에 씁니다.
data = ["첫 번째 줄\n", "두 번째 줄\n", "세 번째 줄\n"]
file = open("sample.txt", "w")
file.writelines(data)
file.close()
파일에 리스트의 내용을 쓸 때는 writelines() 메서드를 사용합니다. 위의 예제에서도 쓰기모드(w)로 파일을 열었기 때문에기존 내용을 덮어쓰게 됩니다. 파일을 덮어쓰지 않고 이어 쓰기 위해서는 w모드가 아닌 a모드로 파일을 열어줘야 합니다.
파일 이어 쓰기
file = open("sample.txt", "a")
file.write("파일에 작성할 문자열1\n")
file.write("파일에 작성할 문자열2\n")
file.close()
파일을 이어 쓰기 모드로 열면 이미 존재하는 파일의 끝에 새로운 데이터를 추가할 수 있습니다. 파일을 열 때 mode 매개변수를 'a' 또는 'a+'로 설정하시면 됩니다. 여기서 a는 이어쓰기 전용 모드이고, a+는 이어쓰기와 읽기 모두 가능한 모드입니다.
같이 쓰면 좋은 파일 입출력 문법
with문을 사용하여 파일 자동으로 close 하기
with open('sample.txt', 'w') as file:
file.write("파일에 작성할 문자열1\n")
file.write("파일에 작성할 문자열2\n")
위의 예제에서는 파일을 사용한 뒤 마지막에 매번 close() 함수를 사용하였습니다. 하지만 이것이 번거롭기도 하고, return을 잘못사용하는 등의 실수로 파일 close가 되지 않는 상황도 배제할 수 없습니다. 파이썬에서는 이런 부분을 감안하여 with open이라는 문법을 새로 만들었는데요. with open을 사용하면 지정된 스코프에서만 파일을 사용할 수 있는 대신에 스코프를 벗어나면 파일을 자동으로 닫아줍니다. 이 방식을 사용하면 파일이 자동으로 닫히므로 코드가 간결해지고 안전해집니다.
파일 입출력 오류 처리
try:
with open('sample.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
except PermissionError:
print("파일을 열 권한이 없습니다.")
except IOError as e:
print(f"파일 읽기 오류: {e}")
파일 입출력 중 오류가 발생할 수 있으므로, 예외 처리를 통해 오류를 처리하는 것이 좋습니다. 위와 같이 try와 except 블록을 사용하여 오류를 처리할 수 있으며 위와 같이 코드를 작성하였을 때 프로그램의 안정성을 높이고 예기치 못한 상황에 대처할 수 있습니다. 오류 종류들은 아래 표를 참고해 주세요.
파일 입출력 오류 종류
오류 종류 | 내용 |
IOError | 파일 입출력과 관련된 일반적인 오류를 처리하기 위한 예외 클래스입니다. 다양한 파일 입출력 오류에 대한 상위 예외입니다. |
FileNotFoundError | 대상 파일을 찾을 수 없을 때 발생하는 예외로 주로 열려고 파일이 없을 때 발생합니다. |
PermissionError | 파일 또는 디렉토리에 대한 액세스 권한이 없는 경우에 발생하는 예외로 주로 파일을 읽거나 쓰려고 할때 권한이 없는 경우 발생합니다. |
FileExistsError | 파일을 생성하려고 할 때 이미 그 이름을 사용하고 있는 파일이 있는 경우 발생하는 예외입니다. |
IsADirectoryError | 파일을 열어야 하는데 디렉토리를 열려고 시도할 때 발생하는 예외입니다. |
NotADirectoryError | 디렉토리가 아닌데 디렉토리로 처리하려고 할 때 발생하는 발생하는 예외입니다. |
UnicodeDecodeError | 파일을 텍스트 모드로 읽을 때 인코딩 문제로 발생하는 예외로 파일의 인코딩과 프로그램에서 사용하는 인코딩이 일치하지 않을 때 발생합니다. |
UnicodeEncodeError | 파일을 텍스트 모드로 쓸 때 인코딩 문제로 발생하는 예외로 파일에 쓸 내용을 지정한 인코딩으로 변환할 수 없는 경우 발생합니다. |
'Language > Python' 카테고리의 다른 글
[Python] 파이썬 SQLite3 모듈 사용법 & 예제 총정리 (0) | 2023.11.24 |
---|---|
[Python] 파이썬 부동 소수점 오차 해결 (decimal 모듈 사용법) (0) | 2023.11.16 |
[Python] 파이썬 클래스 상속(extends) & 예제 총정리 (2) | 2023.10.22 |
[Python] 파이썬 클래스(class) 사용법 & 예제 총정리 (0) | 2023.10.18 |