-
Notifications
You must be signed in to change notification settings - Fork 1
2.07. 내용정리: 7일차
파일 입출력은 파일 I/O(Input/Output)이라고도 하며, 말 그대로 파일을 읽거나 쓰는 것을 의미한다.
-
open함수는 파이썬에서 파일 입출력을 위한 함수이다. - 매개변수로
파일명과파일 열기 모드를 받고 결과값으로 파일 데이터를 돌려준다.
아래는 open 함수를 사용해서 test.txt 라는 텍스트 파일을 생성하는 예시이다.
# 파일명과 열기 모드를 인자값으로 넣어준다.
f = open('test.txt', 'w')
# 파일 입출력을 끝냈다면 반드시 'close' 함수를 사용해서 파일을 닫아준다.
f.close()- 위 예제에서
f.close()는 열려 있는 파일 데이터를 닫아 주는 역할을 한다. - 이 문장은 생략해도 된다.
- 생략이 가능한 이유는 프로그램을 종료할 때 파이썬 프로그램이 열려 있는 파일을 자동으로 닫아주기 때문이다.
- 하지만
close()를 사용해서 열려 있는 파일을 직접 닫아 주는 것이 좋다. - 왜냐하면 쓰기모드
w로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문이다.
공부하면서 곰곰히 생각해본 결과, 메모장이나 ppt 파일을 열어서 수정한 다음에 저장하려고 하면 '프로세스가 이미 실행중입니다.' 라는 메시지가 뜨면서 저장이 안 되는 경우를 말하는 것 같다.
파일 열기 모드에는 다음과 같은 것이 있다.
| 모드 | 설명 |
|---|---|
r |
읽기모드 - 파일을 읽기만 할 때 사용 |
w |
쓰기모드 - 파일에 내용을 쓸 때 사용 |
a |
추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용 |
파일을 쓰기 모드 w 로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고, 해당 파일이 존재하지 않으면 새로운 파일이 생성된다.
위 예제에서는 디렉터리에 파일이 없는 상태에서 test.txt 를 쓰기 모드인 w 로 열었기 때문에 test.txt 라는 이름의 새로운 파일이 현재 디렉터리에 생성되는 것이다.
open함수의 파일 열기 기본 모드는 읽기 모드(r)이다.
- 파이썬 코드에서 파일 경로를 표시할 때
C:/경로/test.txt처럼 슬래시(/)를 사용할 수 있다. - 만약 역슬래시(
\)를 사용한다면C:\\경로\\test.txt처럼 역슬래시를 2개 사용하거나r"C:\경로\test.txt"와 같이 문자열 앞에r문자(Raw String)를 덧붙여 사용해야 한다. - 왜냐하면
"C:\경로\note\test.txt"처럼 파일 경로에\n과 같은 이스케이프 문자가 포함되어 있을 경우, 줄바꿈 문자로 해석되어 의도했던 파일 경로와 달라지기 때문이다.
- 파이썬의 모든 타입은 객체(object) 이며, 이 객체를 정의한 것을 클래스(class) 라고 한다.
- 클래스에는 데이터와 함수를 정의할 수 있다.
- 클래스에
__enter__함수와__close__함수가 정의되어 있는 경우, 이를 자동으로 호출해주는 키워드가 바로with키워드이다.
객체랑 클래스가 무엇인지는 다음 챕터에 나와있는 것 같아서 '아,
with키워드는 자동으로close함수를 호출하는구나.'라고 이해했다.
-
as키워드는 키워드의 뜻에서 유추할 수 있는 것처럼~로써라는 의미를 가지고 있다. - 객체를 다른 이름으로 정의할 수 있다. (즉, 별명을 붙여주는 것과 똑같다.)
with 객체 as 변수명: 이런 식으로 사용하면 된다.
with open('test.txt') as file:
print(file)- 파일에 데이터를 쓰기 위해서는
open함수에 파일 쓰기 모드인w를 인자값으로 넣어준다. - 그 다음
write함수를 통해 파일에 데이터를 쓰면 된다.
data = 'Hello, Python!'
file = open('test.txt', 'w')
file.write(data)
file.close()data = 'Hello, Python!'
with open('test.txt', 'w') as file:
file.write(data)datalist = ['안녕하세요.', '반갑습니다.', '저는 흔한 찐따입니다.', '저는 파이썬을 독학하는 중입니다.']
with open('test.txt', 'w') as file:
for data in datalist:
file.write(data)파이썬에는 외부 파일을 읽어 들여 프로그램에서 사용할 수 있는 여러 가지 방법이 있다.
readline 함수는 파일에서 데이터를 줄 바꿈 문자 \n 를 기준으로 한줄씩 읽어온다.
with open('test.txt') as file:
while True:
line = file.readline()
# 더 이상 불러올 데이터(라인)이 없는 경우, 반복문을 빠져 나온다.
if line is None:
break
print(line)readlines 함수는 파일에서 데이터를 줄 바꿈 문자 \n 를 기준으로 한줄씩 모든 데이터를 불러온다.
with open('test.txt') as file:
lines = file.readlines()
for line in lines:
print(line)- 파일을 읽을 때 줄 끝의 줄 바꿈 문자
\n를 제거하고 사용해야 할 경우가 많다. - 다음처럼 문자열의
strip함수를 사용하면 줄 바꿈 문자를 제거할 수 있다.
with open('test.txt') as file:
lines = file.readlines()
for line in lines:
# 맨 마지막 줄의 줄 바꿈 문자(\n)를 제거한다.
line = line.strip()
print(line)-
read함수는 파일의 내용 전체를 문자열로 돌려준다. - 따라서 아래의 예시 중
data는 파일의 전체 내용이다.
with open('test.txt') as file:
data = file.read()
print(data)파이썬에서 바이너리 데이터를 처리할 때는 bytes 와 bytearray 를 사용한다.
- 바이너리(Binary) 란, 2진수를 의미하며, 바이너리 데이터는 컴퓨터가 처리하는 데이터 형식을 의미한다.
- 즉, 파일로 저장되는 데이터 형식은 바이너리 형태로 저장된다.
- 이를테면 이미지 파일이 대표적이다.
- 파일을 읽을 경우
rb, 파일을 쓸 경우wb와 같이 옵션에b를 붙여주면 바이너리 형식으로 파일 입출력을 할 수 있다. - 파이썬에는 바이너리 형식의 데이터를 저장하는
bytes라는 타입이 존재한다. -
bytes타입은 1바이트 단위의 값을 연속적으로 가지는 파이썬의 데이터 타입이다.- 단위: 1바이트(byte) = 8비트(bit)
-
bytes타입을 정의하는 방식은 다음과 같다.-
bytes(길이): 정해진 길이만큼0으로 채워진 바이트 객체를 생성 -
bytes(이터레이터): 반복 가능한 객체로 바이트 객체를 생성 -
bytes(바이트_객체): 바이트 객체로 바이트 객체를 생성
-
아래는 bytes 타입을 정의하고 출력해보는 예시이다.
# 0이 10개 들어있는 바이트
a = bytes(10)
# 결과: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
print(a)
# 리스트로 바이트 객체 생성
b = bytes([10, 20, 30, 40, 50])
# 결과: b'\n\x14\x1e(2'
print(b)
# 바이트 객체로 바이트 객체 생성
c = bytes(b'Python')
# 결과: b'Python'
print(c)- 즉, 파이썬에서
b'Python'처럼'문자열'이나"문자열"앞에b를 붙이면 바이트(bytes) 객체가 된다. - 간단하게
'Python'와 문자열str의 관계라고 생각하면 된다.
-
bytearray타입도 1바이트 단위의 값을 연속적으로 저장하는 시퀀스 자료형이다. -
bytes타입과의 차이점은 요소 변경 여부의 차이가 존재한다. -
bytes타입은 요소를 변경할 수 없고,bytearray타입은 요소를 변경할 수 있다. - 쉽게 말해,
list타입과tuple타입의 관계라고 생각하면 된다. -
bytearray타입을 정의하는 방식은 다음과 같다.-
bytearray(): 빈 바이트 배열 객체를 생성 -
bytearray(길이): 정해진 길이만큼0으로 채워진 바이트 배열 객체를 생성 -
bytearray(이터레이터): 반복 가능한 객체로 바이트 배열 객체를 생성 -
bytearray(바이트_객체): 바이트 객체로 바이트 배열 객체를 생성
-
x = bytearray(b'Python')
# 인덱싱을 통해 값을 변경해주는 것이 가능하다.
# ord 함수는 문자의 ASCII 코드를 반환해주는 내장 함수이다.
x[0] = ord('Hi')
# 결과: bytearray(b'HiPython')
print(x)- 이미지 파일은 바이너리 형태로 저장되어있다.
- 따라서 이미지 파일을 불러오려면
rb옵션을 통해bytes타입으로 불러온다. - 반대로, 이미지 파일을 저장하려면
wb옵션을 사용한 후,write함수에bytes타입을 넣어준다.
아래는 이미지 파일 test.png 을 입출력하는 예시이다.
with open('test.png', 'rb') as img:
data = img.read()
print(data)
print(type(data))
# 불러온 'test.png' 파일을 'test2.png'라는 새로운 이미지 파일로 저장한다.
with open('test2.png', 'wb') as img:
# 불러왔던 bytes 객체 'data'를 넣어준다.
img.write(data)즉, 불러온 이미지 파일을 변수 data 에 할당한 후 출력해보면 앞에 b 가 붙은 bytes 타입이라는 것을 확인할 수 있다.