Skip to content

2.07. 내용정리: 7일차

흔한 찐따 edited this page Apr 1, 2022 · 2 revisions

파일 입출력

파일 입출력은 파일 I/O(Input/Output)이라고도 하며, 말 그대로 파일을 읽거나 쓰는 것을 의미한다.

open 함수

  • open 함수는 파이썬에서 파일 입출력을 위한 함수이다.
  • 매개변수로 파일명파일 열기 모드를 받고 결과값으로 파일 데이터를 돌려준다.

예제

아래는 open 함수를 사용해서 test.txt 라는 텍스트 파일을 생성하는 예시이다.

# 파일명과 열기 모드를 인자값으로 넣어준다.
f = open('test.txt', 'w')
# 파일 입출력을 끝냈다면 반드시 'close' 함수를 사용해서 파일을 닫아준다.
f.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 과 같은 이스케이프 문자가 포함되어 있을 경우, 줄바꿈 문자로 해석되어 의도했던 파일 경로와 달라지기 때문이다.

with

  • 파이썬의 모든 타입은 객체(object) 이며, 이 객체를 정의한 것을 클래스(class) 라고 한다.
  • 클래스에는 데이터와 함수를 정의할 수 있다.
  • 클래스에 __enter__ 함수와 __close__ 함수가 정의되어 있는 경우, 이를 자동으로 호출해주는 키워드가 바로 with 키워드이다.

객체랑 클래스가 무엇인지는 다음 챕터에 나와있는 것 같아서 '아, with 키워드는 자동으로 close 함수를 호출하는구나.'라고 이해했다.

as

  • as 키워드는 키워드의 뜻에서 유추할 수 있는 것처럼 ~로써 라는 의미를 가지고 있다.
  • 객체를 다른 이름으로 정의할 수 있다. (즉, 별명을 붙여주는 것과 똑같다.)

open 함수와 with 키워드 함께 사용하기

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()

withas 키워드로 사용하기

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)

파일 읽기

파이썬에는 외부 파일을 읽어 들여 프로그램에서 사용할 수 있는 여러 가지 방법이 있다.

1. readline 함수

readline 함수는 파일에서 데이터를 줄 바꿈 문자 \n 를 기준으로 한줄씩 읽어온다.

with open('test.txt') as file:
    while True:
        line = file.readline()
        # 더 이상 불러올 데이터(라인)이 없는 경우, 반복문을 빠져 나온다.
        if line is None:
            break
        print(line)

2. readlines 함수

readlines 함수는 파일에서 데이터를 줄 바꿈 문자 \n 를 기준으로 한줄씩 모든 데이터를 불러온다.

with open('test.txt') as file:
    lines = file.readlines()
    
    for line in lines:
        print(line)
줄 바꿈 문자 \n 제거하기
  • 파일을 읽을 때 줄 끝의 줄 바꿈 문자 \n 를 제거하고 사용해야 할 경우가 많다.
  • 다음처럼 문자열의 strip 함수를 사용하면 줄 바꿈 문자를 제거할 수 있다.
with open('test.txt') as file:
    lines = file.readlines()

    for line in lines:
        # 맨 마지막 줄의 줄 바꿈 문자(\n)를 제거한다.
        line = line.strip()
        print(line)

3. read 함수

  • read 함수는 파일의 내용 전체를 문자열로 돌려준다.
  • 따라서 아래의 예시 중 data 는 파일의 전체 내용이다.
with open('test.txt') as file:
    data = file.read()
    print(data)

bytes 타입과 bytearray 타입

파이썬에서 바이너리 데이터를 처리할 때는 bytesbytearray 를 사용한다.

bytes

  • 바이너리(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

  • 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)

이미지(Image) 파일 입출력

  • 이미지 파일은 바이너리 형태로 저장되어있다.
  • 따라서 이미지 파일을 불러오려면 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 타입이라는 것을 확인할 수 있다.

흔한 찐따

안녕하세요, 흔한 찐따 입니다.

Clone this wiki locally