2.1 텍스트 파일 다루기 Last updated: 2023-10-31 18:33:26

파이썬을 이용해 파일을 다룰 때 가장 많이 사용하게 될 텍스트 파일을 다루는 방법에 대해 알아봅니다.

2.1.1 파일 모드

텍스트 파일을 사용하려면 내장 함수인 open( )을 사용한다. 파일을 열 때 읽기, 쓰기, 읽고 쓰기, 파일 추가하기 등 파일을 사용할 목적에 따른 모드를 정해야 하고, 파일의 포맷이 텍스트 형식인지 바이너리 형식인지 정해 주어야 한다.

일단 파일을 open( )을 하면 운영체제에서 해당 파일을 누군가 작업하고 있구나 라고 생각해서 이후 파일 이름 바꾸기나 삭제하기 등을 못하게 막는다. 따라서 사용이 끝난 파일은 꼭 close( ) 함수를 사용해 닫아주어야 한다.


가장 기본적인 파일 열기 형식은 다음과 같다.

형식

f = open(file, mode, encoding='utf8')

설명

• file : 파일 경로 및 파일명, 소스 코드와 같은 경로인 경우 파일명을 입력한다. 만일 다른 경로에 파일이 있다면 상대 경로 혹은 절대 경로를 입력한다.
• mode : (선택) 파일 열기 모드, 첫 번째 글자는 파일을 열 때 사용하는 모드를 지정한다. 아래 [파일 열기 모드]를 참고한다. 두 번째 문자는 파일의 형식을 지정하는 것으로 'b' 혹은 't' 중에 사용한다.
• encoding : (선택) 텍스트 인코딩 방식, 영어가 아닌 경우 혹은 utf8이 아닌 다른 종류인 경우 이를 지정한다. 기본 값은 'utf8'이다.

반환

f : 파일 객체, 사용 후 닫아주어야 한다.

[표 7] 파일 열기 모드

기호

설명

'r'

Read, 파일을 읽기 모드로 연다. 이미 존재하는 파일을 여는 것이기 때문에 파일이 존재하지 않는다면 오류가 발생된다. (파일 열기 기본 모드)

'w'

Write, 파일을 쓰기 위해서 연다. 이미 파일이 있다면 삭제하고 새로 생성한다. 파일이 없다면 파일을 새로 생성한다.

'x'

Exclusive Creation, 파일을 배타적으로 생성한다. 이미 파일이 있다면 오류가 발생된다.

'a'

Append, 파일을 추가 작성 모드로 연다. 다시말해 기존 파일의 내용을 그대로 두고 그 뒤에 내용을 추가하기 위해 사용한다. 만일 파일이 존재하지 않는다면 파일을 생성한다. 이 모드로 파일을 열고 파일에 write를 하면 자동으로 파일 맨뒤에 내용이 추가된다.

'+'

Open for Update, 파일 읽고 내용을 추가할 때 사용한다.

'b'

Binary, 바이너리 형식으로 파일을 연다.

't'

Text, 텍스트 형식으로 파일을 연다. (파일 형식 기본 값)

사용 예시

  • ‘r’: 읽기 모드로 텍스트 파일을 연다. ‘rt’와 같다.

  • ‘w+’: 쓰기 모드로 텍스트 파일을 열어서 파일 뒤에 내용을 추가한다. ‘w+t’와 같다.

  • ‘w+b’: 쓰기 모드로 바이너리 파일을 열어서 파일 뒤에 내용을 추가한다.


2.1.2 텍스트 파일 열기

특히 텍스트 파일을 열 때는 주의할 것이 있다. 바로 인코딩 방식이다. 파이썬의 open( ) 함수는 기본적으로 파일을 텍스트 형식으로 열기 때문에 ‘t’ 문자열을 모드에 지정하지 않아도 된다. 하지만 운영체제에 따라 encoding의 기본값이 다를 수 있기 때문에 여러 플랫폼에서 동작하는 코드를 작성하려면 파일의 인코딩 형식을 정확하게 입력해 주는 것이 좋다. 텍스트 파일을 여는 형식은 다음과 같다. 이전의 형식과 동일하며 인자 값만 달라진다.

형식

open(file, mode, encoding='utf8')

파라미터

• file (string) : 파일 경로 및 파일명, 소스 코드와 같은 경로인 경우 파일명을 입력한다. 만일 다른 경로에 파일이 있다면 상대 경로 혹은 절대 경로를 입력한다.
• mode (string) : (옵션) 파일 열기 모드, 첫 번째 글자는 파일을 열 때 사용하는 모드를 지정한다. [파일 열기 모드]를 참고한다. 두 번째 문자는 파일의 형식을 지정한다. 텍스트 파일인 경우 't'를 사용하면 된다.
• encoding (string) : (옵션) 텍스트 파일의 문자열 인코딩 방식을 지정한다. 다국어인 경우 utf-8이 대표적이고, 한글인 경우 'euc-kr'이나 'cp949'를 사용하는 경우도 있다.

반환

(file) 파일 객체, 사용 후 닫아주어야 한다.

다음은 윤동주의 서시의 영어 버전 텍스트로 UTF-8 형식으로 저장된 텍스트 파일이며 소스 코드와 동일한 위치에 저장되어 있다고 가정한다.


[파일 4] prologue.txt

Prologue

Yun Dong-ju / poet

May I look up into the heavens until the day I die
Without a bit of shame
From even the wind rustling the leaves
I have suffered
With the singing heart of the stars
I shall love all that is to die
And the road given me
I shall walk

Tonight also, the stars are touched by the wind

이제 위의 prologue.txt 파일을 읽어 화면에 출력하는 예제를 살펴보자.


[예제 6- 26] 텍스트 파일 열기

# [1] 파일 열기
poem_file = open("prologue.txt", "rt")
while True:
    
    # [2] 파일 내용 읽기
    content = poem_file.read()
    
    # [3] 파일 읽기 종료
    if content == "":
        break
    print(content)

# [4] 파일 닫기
poem_file.close()

[결과]

Prologue

Yun Dong-ju / poet

May I look up into the heavens until the day I die
Without a bit of shame
From even the wind rustling the leaves
I have suffered
With the singing heart of the stars
I shall love all that is to die
And the road given me
I shall walk

Tonight also, the stars are touched by the wind

위 예제에 대해 설명한다.

  • [1]에서 open( ) 함수를 이용해 prologue.txt 파일을 연다. 첫 번째 인자로 파일명을 입력한다. 이 때 파일의 경로를 따로 적지 않은 이유는 현재 소스 코드와 동일한 위치에 파일이 있기 때문이다. 만일 다른 경로에 파일이 존재한다면 파일명 앞에 파일 경로를 같이 적어주어야 한다. 모드는 “rt”라고 적었다. “r”은 일기 모드라는 의미이다. 따라서 write( ) 메서드를 사용해 파일 쓰기를 하면 오류가 발생된다. 그 뒤에 “t”는 텍스트(text) 모드라는 의미이다. 텍스트 파일이기 때문에 적어준 것인데, 기본은 텍스트 모드이므로 “rt” 대신 “r” 이라고 써도 결과는 같다.

  • [2]에서 read( ) 함수를 써서 파일의 내용을 읽어온다. 읽어온 내용은 content 변수에 담겨 있고, 텍스트일 것이다.

  • [3]에서 읽어온 내용이 비어 있지는 않는지 검사한다. 만일 내용이 비어 있다면 while 문을 종료한다.

  • [4]에서 열었던 파일을 닫아준다.

  • 결과를 보면 텍스트 파일이 잘 출력 되었다.


2.1.3 다국어 텍스트 파일 열기

다국어 텍스트 파일 테스트를 위해 한글로 된 텍스트 파일을 열어보자. 영어 이외의 텍스트 파일은 보통 인코딩을 지정해 주어야 오류 없이 파일을 읽어드릴 수 있다. 다음은 한글이 포함된 텍스트 문서이다.

[파일 5] prologue_utf8.txt

서시(序詩)

윤동주 / 시인

죽는 날까지 하늘을 우러러
한 점 부끄럼이 없기를,
잎새에 이는 바람에도
나는 괴로워했다.
별을 노래하는 마음으로
모든 죽어가는 것을 사랑해야지
그리고 나한테 주어진 길을
걸어가야겠다.

오늘 밤에도 별이 바람에 스치운다.

이제 위의 prologue.txt 파일을 읽어 화면에 출력하는 예제를 살펴보자.


[예제 6- 27] utf-8 텍스트 파일 읽기

# [1] 파일 열기
f = open("prologue_utf8.txt","rt", encoding="utf8")
while True:
    c = f.read()
    if c == "":
        break
    print(c, end="")

f.close()

[결과]

서시(序詩)

윤동주 / 시인

죽는 날까지 하늘을 우러러
한 점 부끄럼이 없기를,
잎새에 이는 바람에도
나는 괴로워했다.
별을 노래하는 마음으로
모든 죽어가는 것을 사랑해야지
그리고 나한테 주어진 길을
걸어가야겠다.

오늘 밤에도 별이 바람에 스치운다.

위 예제에 대해 설명한다.

  • [1]에서 파일을 열어준다. 처음 두 개의 매개변수인 파일 경로와 모드는 이전과 동일하다. 마지막 encoding 매개변수에 인코딩 형식을 문자열로 지정한다. 여기서 ‘utf-8’ (혹은 ‘utf8’)을 입력했다.

  • 나머지는 이전 내용과 동일하다. utf8 인코딩으로 작성된 텍스트 문서의 내용도 출력이 정상적으로 되었다.

만일 텍스트 문서를 열 때 encoding 값을 잘못 입력하면 파일을 열 때는 오류가 발생하지 않지만 내용을 읽어올 때는 다음과 같은 읽어오기 오류가 발생한다.

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in position 0: invalid start byte


2.1.4 with로 파일 자동 닫기

파일을 open( ) 함수를 이용해 일단 열고 사용이 끝나면 꼭 close( ) 함수를 이용해 닫아주어야 한다고 했다. 파일을 명시적으로 닫아주는 기능을 잊지 않기 위해 자동으로 닫아주는 with 함수를 사용해 본다. with 함수를 이용해 파일을 열면 파일 사용이 끝나고 with 구문이 종료될 때 자동으로 열려 있는 파일을 닫아준다. with 구문 형식은 다음과 같다.

형식

with open(file, mode, encoding) as f:
    # do something

파라미터

• file (string): 파일 경로 및 파일명, 소스 코드와 같은 경로인 경우 파일명을 입력한다. 만일 다른 경로에 파일이 있다면 상대 경로 혹은 절대 경로를 입력한다.
• mode (string) : (옵션) 파일 열기 모드, 첫 번째 글자는 파일을 열 때 사용하는 모드를 지정한다. [파일 열기 모드]를 참고한다. 두 번째 문자는 파일의 형식을 지정한다. 텍스트 파일인 경우 't'를 사용하면 된다.
• encoding (string) : (옵션) 텍스트 파일의 문자열 인코딩 방식을 지정한다. 다국어인 경우 'utf-8'이 대표적이고, 한글인 경우 'euc-kr'이나 'cp949'를 사용하는 경우도 있다.

반환

f : 파일 객체, 사용 후 with 문이 끝나면 파일이 자동으로 닫히므로 따로 닫아줄 필요가 없음

with 문을 이용해 파일을 여는 예제를 살펴보자.


[예제 6- 28] with 문을 이용해 텍스트 파일 읽기

# [1] 파일 열기
with open("prologue_utf8.txt","rt", encoding='utf-8') as f:
    # [2] 내용
    while True:
        c = f.read()
        if c == '':
            break
        print(c, end='')

[결과]

서시(序詩)

윤동주 / 시인

죽는 날까지 하늘을 우러러
한 점 부끄럼이 없기를,
잎새에 이는 바람에도
나는 괴로워했다.
별을 노래하는 마음으로
모든 죽어가는 것을 사랑해야지
그리고 나한테 주어진 길을
걸어가야겠다.

오늘 밤에도 별이 바람에 스치운다.

위 예제에 대해 설명한다.

  • [1]에서 with 문을 이용해 파일을 연다. open( ) 함수를 이용하는 방법은 이전과 동일하다. 다만 with 문 옆에 작성한다는 것만 다르다. 그리고 열린 파일 객체를 대입 연산자인 ‘=’을 이용해 받는 것이 아니라 as 명령을 이용해 이름을 지정한다는 것만 다르다. 물론 명령이 끝나면 콜론(’:’)을 이용해 with 명령줄이 종료되었음을 알린다.

  • [2]에서는 파일 객체를 이용하는 코드 내용을 작성한다. with 구문 보다 들여쓰기가 되어 있어야 with 구문에 포함되는 내용인 것을 알 수 있다. 파일 작성이 종료되면 close( ) 함수를 사용하지 않아도 자동으로 열린 파일이 닫힌다.


2.1.5 파일 객체의 메서드 사용

파일을 열면 파일 객체가 반환된다. 이 객체를 이용해 파일을 다루는 다양한 기능을 처리할 수 있다.

A. read( ) 함수

다음은 파일 객체를 이용해 파일 내용을 읽는 read( ) 함수의 형식이다.

형식

read(size=-1)

파라미터

• size : (선택) 기본값은 -1이고, 모든 파일을 읽어온다. size는 파일에서 읽어올 바이트 크기를 의미한다.

반환

string or bytes object : 텍스트 모드에서는 string의 문자열을 반환하고, 바이너리 모드에서는 바이트 객체를 반환한다.

다음은 읽어올 크기를 지정하고 파일을 읽어오는 예제이다.


[예제 6- 29] read( ) 함수 사용하기

# [1] 파일 열기
with open("prologue_utf8.txt","rt", encoding='utf-8') as f:
    # [2] 내용
    c = f.read(47)
    print(c, end='')

[결과]

서시(序詩)

윤동주 / 시인

죽는 날까지 하늘을 우러러
한 점 부끄럼이 없기를,

위 예제에 대해 설명한다.

  • [1]에서 파일을 연다. 반환된 파일 객체 변수는 f 이다.

  • [2]에서 파일의 내용을 47바이트 만큼 읽어온다.

  • 결과를 보면 읽어온 내용은 전체 중 일부가 6줄 정도 분량이 화면에 출력되었다.


B. readline( ) 함수

readline( )는 텍스트 파일의 내용을 한 줄씩 읽어오는 함수이다. 텍스트 파일에서 줄을 구분하는 문자는 줄 구분자(new line character)인 "\n"이다. 해당 문자를 만나면 줄 바꿈이 된다고 인지한다.

형식

readline(size=-1)

파라미터

• size (int) : 읽어올 줄 수를 입력한다. 기본값은 -1이다.

반환

(string) 한 줄에 해당하는 문자열로 줄바꿈 문자('\n') 까지 읽어서 반환한다.

다음은 읽어올 크기를 지정하고 파일을 읽어오는 예제이다.


[예제 6- 30] readline( ) 함수로 파일 읽기

# [1] 파일 열기
with open("prologue_utf8.txt","rt", encoding='utf-8') as f:
    # [2] 내용
    c = f.readline()
    print(c, end='')
    
    # [3] 한줄 읽기
    c = f.readline()
    print(c, end='')
    
    # [4] 한줄 읽기
    c = f.readline(3)
    print(c, end='')

[결과]

서시(序詩)

윤동주

위 예제에 대해 설명한다.

  • [1]에서 텍스트 파일을 열었다.

  • [2]에서 텍스트 한 줄을 읽어와서 출력한다. 이 때 size 변수를 지정하지 않았기 때문에 한 줄을 다 읽어 왔다.

  • [3]에서 텍스트 한 줄을 읽어와서 출력한다. 이 때 size 변수를 지정하지 않았기 때문에 한 줄을 다 읽어 왔다. 다만 이 줄에는 내용이 없고 공백만 출력된다.

  • [4]에서 텍스트 한 줄을 읽어와서 출력한다. 이 때 size 변수를 3이라고 지정했기 때문에 한 줄을 끝까지 읽지 않고 3바이트만 읽어 와서 출력한다.


C. readlines( ) 함수

readlines( )는 파일에서 텍스트를 줄 단위로 읽어오는 함수이다. 원하는 최대 줄 수를 지정하면 그에 해당하는 텍스트를 읽어온다.

형식

readlines(hint=-1)

파라미터

• hint : hint는 읽어올 줄 수를 의미한다. 기본값은 -1이며 모든 줄을 읽어온다.

반환

(list) 읽어온 텍스트가 한 줄 씩 포함된 리스트이다.

다음은 읽어올 크기를 지정하고 파일을 읽어오는 예제이다.


[예제 6- 31] readlines( ) 함수로 파일 읽기

# [1] 파일 열기
with open("prologue_utf8.txt","rt", encoding='utf-8') as f:
    # [2] 내용
    c = f.readlines(40)
    # [3] 줄 단위 반복
    for line in c:
        print(line, end='')

[결과]

서시(序詩)

윤동주 / 시인

죽는 날까지 하늘을 우러러
한 점 부끄럼이 없기를,

위 예제에 대해 설명한다.

  • [1]에서 텍스트 파일을 열었다.

  • [2]에서 파일을 읽어온다. 최대 40바이트까지 읽어오도록 hint 값을 지정했다.

  • [3]에서 읽어온 텍스트 리스트를 반복한다. 읽어온 줄 수만큼 반복된다.

  • 출력 결과를 보면 내용이 없는 빈 줄을 포함해 총 6 줄이 출력 되었다. 하지만 한 줄이 중간에서 끊어지지 않았다.


D. tell( ) 함수

tell( )은 현재 파일 내에서 커서 위치를 알아낼 때 사용한다. 파일을 읽기 모드로 처음 열면 커서 위치는 파일의 제일 앞인 0을 가리킨다. 그 이후에 read( ), readline( ), seek( ) 등 함수를 통해 위치가 변경된다.

형식

tell( )

반환

(int) 파일 내에서 현재 커서의 위치를 반환한다.

read( ) 함수 실행 이후에 커서 위치가 변경되는지 확인해보자.


[예제 6- 32] tell( ) 함수로 커서 위치 읽기

# [1] 파일 열기
with open("prologue_utf8.txt","rt", encoding='utf-8') as f:
    # [2] 처음 커서 위치
    print("처음 커서 위치:", f.tell())
    
    # [3] 내용 읽기
    c = f.read()
    
    # [4] 처음 커서 위치
    print("read() 실행 이후 커서 위치:", f.tell())

[결과]

처음 커서 위치: 0
read() 실행 이후 커서 위치: 353

위 예제에 대해 설명한다.

  • [1]에서 텍스트 파일을 열었다.

  • [2]에서 현재의 커서 위치를 출력한다. 결과를 보면 위치는 0 이다.

  • [3]에서 파일을 읽었다. read( ) 함수에 특별한 인자를 입력하지 않았으므로 아마도 파일 전체를 읽어왔을 것이다.

  • [4]에서 현재의 커서 위치를 출력한다. read( ) 함수를 실행한 뒤이기 때문에 현재 위치 값이 353이고, 이는 아마도 파일의 끝 위치일 것이다.

readline( ) 함수 실행 이후에 커서 위치가 변경되는지 확인해보자.


[예제 6- 33] readline( ) 이후 커서 위치 확인하기

# [1] 파일 열기
with open("prologue_utf8.txt","rt", encoding='utf-8') as f:
    # [2] 처음 커서 위치
    print("처음 커서 위치:", f.tell())
    
    # [3] 한줄 읽기
    print(f.readline(6))
    
    # [4] 현재 위치 출력
    print("position:", f.tell())

[결과]

처음 커서 위치: 0
서시(序詩)
position: 14

위 예제에 대해 설명한다.

  • [1]에서 파일을 열었다.

  • [2]에서 현재 파일 내에서 커서 위치를 출력한다. 파일을 읽기 모드로 열고 아무것도 하지 않았기 때문에 문서 맨 앞인 0에 커서가 위치한다.

  • [3]에서 텍스트 한 줄을 readline( ) 함수를 이용해 읽어온다. 이 때 size값을 6으로 주어 6자의 문자를 읽어 왔다.

  • [4]에서 현재 커서 위치를 읽어온다. readline( ) 함수를 텍스트를 일부 읽어왔기 때문에 커서 위치가 변경되었다. 현재 화면에는 한글과 기호, 한자를 포함해 총 6자를 읽어왔지만 글자마다 차지하는 바이트 크기가 다르고 tell( ) 함수에서 반환하는 위치는 바이트를 기준으로 하기 때문에 글자수와 맞지 않는 값이 출력 되었다.


2.1.6 텍스트 파일 쓰기


A. 영문 문장 리스트 파일 쓰기

기본적으로 여러 개의 영문 문장의 데이터를 텍스트 파일로 쓰는 일은 간단한다. 파이썬의 파일 스트림 객체에서 기본 제공하는 write( ), 혹은 writelines( ) 함수를 이용한다.

형식

writelines(iterable)

파라미터

• iterable : 여러 줄의 문자열을 포함한 반복 가능한 집합 객체이다.

다음은 영문 문장들의 리스트를 텍스트 파일로 저장하는 예제이다. 내용은 제가 좋아하는 에드 시런의 Perfect 라는 곡의 가사 일부이다.


[예제 6- 34] writelines( ) 함수로 파일 쓰기

# [1] 문장 리스트
sentences = ['I found a love, for me.',
            'Darling, just dive right in and follow my lead.',
            'Well, I found a girl, beautiful and sweet.',
            'Oh, I never knew you were the someone waiting for me.']

# [2] 파일 오픈
with open('perfect1.txt', 'wt') as f:
    
    # [3] 여러줄 쓰기
    f.writelines(sentences)

[결과] perfect1.txt

I found a love, for me.Darling, just dive right in and follow my lead.Well, I found a girl, beautiful and sweet.Oh, I never knew you were the someone waiting for me.

위 예제에 대해 설명한다.

  • [1]에서 파일에 기록할 문장들의 리스트를 정의한다. 전체가 하나의 문자열 변수가 아니라 각 문장 하나하나가 모여 리스트 형태로 저장되어 있다.

  • [2]에서 파일을 연다. 단, ‘wt’ 모드로 열어서 텍스트 모드임을 알려준다.

  • [3]에서 writelines( ) 함수를 이용해 문장 리스트를 한 번에 파일에 쓴다.

위 예제 코드를 실행하면 ‘perfect1.txt’라는 파일이 생성된다. 파일을 열어보면 전체 문장의 리스트가 기록되어 있다. 다만 문장과 문장 사이에 공백이 없고, 줄바꿈도 되어 있지 않다. 파일의 인코딩은 별도로 지정하지 않았으므로 ‘utf-8’ 형식으로 저장되었다.



B. 영문 문장 리스트 줄바꿔 파일 쓰기

위의 예제는 각 문장들이 구분없이 이어져 있다. 때에 따라 각 문장을 새로운 줄에서 시작하도록 줄바꿈을 추가하고 싶을 수 있다. 가장 쉬운 방법은 문장 리스트를 생성할 때 문장 뒤에 줄바꿈 문자(’\n’)를 추가하여 생성한 후 파일에 기록하는 것이다. 다음 예제는 줄바꿈 문자가 추가된 문장 리스트를 텍스트 파일에 기록하는 내용이다.

[예제 6- 35] 텍스트 파일 줄바꿔 저장

# [1] 문장 리스트
sentences = ['I found a love, for me.\n',
            'Darling, just dive right in and follow my lead.\n',
            'Well, I found a girl, beautiful and sweet.\n',
            'Oh, I never knew you were the someone waiting for me.\n']

# [2] 파일 오픈
with open('perfect2.txt', 'wt') as f:
    
    # [3] 여러줄 쓰기
    f.writelines(sentences)

[결과] perfect2.txt

I found a love, for me.
Darling, just dive right in and follow my lead.
Well, I found a girl, beautiful and sweet.
Oh, I never knew you were the someone waiting for me.

위 예제에 대해 설명한다.

  • [1]에서 파일에 기록할 문장들의 리스트를 정의한다. 각 문장들 맨 뒤에는 줄바꿈 문자열(’\n’)이 추가되어 있다.

  • [2]에서 파일을 연다. 단, ‘wt’ 모드로 열어서 텍스트 모드임을 알려준다.

  • [3]에서 writelines( ) 함수를 이용해 문장 리스트를 한 번에 파일에 쓴다.

위 예제를 실행하면 생성된 ‘perfect2.txt’ 파일을 열어보면 다음과 같다. 각 줄은 이어져 있지 않고 각각 새로운 줄에 쓰여져 있다.



C. 영문 문장을 한 문장씩 쓰기

다음은 문장 리스트는 줄바꿈 문자 없이 생성하고, writelines( ) 함수로 한 번에 쓰는 대신 write( ) 함수로 한 줄씩 쓰면서 빈줄을 바로 추가하는 방법이다.

[예제 6- 36] write( ) 함수로 한 줄씩 줄 바꿔 파일에 쓰기

# [1] 문장 리스트
sentences = ['I found a love, for me.',
            'Darling, just dive right in and follow my lead.',
            'Well, I found a girl, beautiful and sweet.',
            'Oh, I never knew you were the someone waiting for me.']

# [2] 파일 오픈
with open('perfect3.txt', 'wt') as f:
    # [3] 문장 리스트 반복
    for i, sentence in enumerate(sentences):
        # [4] 문장 단위 파일 쓰기
        f.write(f"[{i+1}] {sentence}" + '\n')

[결과] perfect3.txt

[0] I found a love, for me.
[1] Darling, just dive right in and follow my lead.
[2] Well, I found a girl, beautiful and sweet.
[3] Oh, I never knew you were the someone waiting for me.

위 예제에 대해 설명한다.

  • [1]에서 파일에 기록할 문장들의 리스트를 정의한다. 단, 각 문장 끝에는 줄바꿈 문자(’\n’)이 포함되어 있지 않는다.

  • [2]에서 파일을 연다. 단, ‘wt’ 모드로 열어서 텍스트 모드임을 알려준다.

  • [3]에서 문장 리스트를 for 문으로 한 문장씩 반복한다.

  • [4]에서 write( ) 함수를 이용해 한 문장씩 쓰기한다. 단, 문장 맨 뒤에 줄바꿈 문자(’\n’)를 추가해준다. f-string 포매팅을 이용해 각 줄번호를 맨 앞에 추가하고, 그 뒤에 문자열, 맨 뒤에 줄바꿈 문자열을 추가해준다.

  • 위 소스 코드를 실행하면 ‘perfect3.txt’ 파일이 생성된다.


D. 한글 문장 리스트 파일 쓰기

이제 한글이 포함된 문장들을 텍스트 파일로 쓰는 방법에 대해 설명한다. 한글이 포함된 경우 신경써야 하는 것은 생성된 텍스트 파일의 인코딩 방식이다. 파이썬에서 별도로 지정하지 않는다면 UTF-8이 기본 인코딩 방식이다. UTF-8은 한글 문장을 쓰는데 문제가 없다. 단, 별도의 한글만을 위한 인코딩을 사용하고자 한다면 ‘EUC-KR’이나 ‘CP949’를 사용해도 된다. 중요한 것은 파일을 읽을 때 어떤 인코딩 방식을 선호하는지 이다. 다음은 한글 문장을 텍스트 파일로 쓰는 예제이다. 걸그룹인 IVE가 부른 ‘I AM’의 일부이다.

[예제 6- 37] 문자열 리스트 파일 쓰기

# [1] 문장 리스트
sentences = ["다른 문을 열어 따라갈 필요는 없어",
             "넌 너의 길로, 난 나의 길로, 음음",
             "하루하루마다 색이 달라진 느낌",
             "밝게 빛이 나는 길을 찾아",
             "I'm on my way, 넌 그냥 믿으면 돼",
             "I'm on my way, 보이는 그대로야"
             "너는 누군가의 dreams come true",
             "제일 좋은 어느 날의 데자뷔",
             "머물고픈 어딘가의 낯선 뷰",
             "I'll be far away, that's my-"]

# [2] 파일 오픈
with open('i_am1.txt', 'wt') as f:
    
    # [3] 여러줄 쓰기
    f.writelines(sentences)

[결과] i_am1.txt

다른 문을 열어 따라갈 필요는 없어넌 너의 길로, 난 나의 길로, 음음하루하루마다 색이 달라진 느낌밝게 빛이 나는 길을 찾아I'm on my way, 넌 그냥 믿으면 돼I'm on my way, 보이는 그대로야너는 누군가의 dreams come true제일 좋은 어느 날의 데자뷔머물고픈 어딘가의 낯선 뷰I'll be far away, that's my-

위 예제에 대해 설명한다.

  • [1]에서 파일에 기록할 문장들의 리스트를 정의한다. 전체가 하나의 문자열 변수가 아니라 각 문장 하나하나가 모여 리스트 형태로 저장되어 있다.

  • [2]에서 파일을 연다. 단, ‘wt’ 모드로 열어서 텍스트 모드임을 알려준다. 인코딩 방식은 특별히 지정하지 않았다.

  • [3]에서 writelines( ) 함수를 이용해 문장 리스트를 한 번에 파일에 쓴다.

  • 위 소스 코드를 실행하면 ‘i_am1.txt’ 파일이 생성된다. 파일의 인코딩은 한글 인코딩 방식인 ‘EUC-KR’로 생성되었다.


E. 한글 문장 리스트 인코딩 형식 지정하기

한글 처리를 위한 인코딩 방식을 지정하는 방법에 대해 알아보자. 다른 것은 동일한데 파일을 열 때 encoding 인자를 통해 형식을 문자열로 지정할 수 있다. 다음은 UTF-8 형식으로 텍스트 파일을 작성하는 예제이다.

[예제 6- 38] UTF-8 형식으로 파일 쓰기

# [1] 문장 리스트
sentences = ["다른 문을 열어 따라갈 필요는 없어",
             "넌 너의 길로, 난 나의 길로, 음음",
             "하루하루마다 색이 달라진 느낌",
             "밝게 빛이 나는 길을 찾아",
             "I'm on my way, 넌 그냥 믿으면 돼",
             "I'm on my way, 보이는 그대로야"
             "너는 누군가의 dreams come true",
             "제일 좋은 어느 날의 데자뷔",
             "머물고픈 어딘가의 낯선 뷰",
             "I'll be far away, that's my-"]

# [2] 파일 오픈
with open('i_am2.txt', 'wt', encoding='UTF-8') as f:
    
    # [3] 여러줄 쓰기
    f.writelines(sentences)

[결과] i_am2.txt

다른 문을 열어 따라갈 필요는 없어넌 너의 길로, 난 나의 길로, 음음하루하루마다 색이 달라진 느낌밝게 빛이 나는 길을 찾아I'm on my way, 넌 그냥 믿으면 돼I'm on my way, 보이는 그대로야너는 누군가의 dreams come true제일 좋은 어느 날의 데자뷔머물고픈 어딘가의 낯선 뷰I'll be far away, that's my-

위 소스 코드를 실행하면 ‘i_am2.txt’ 파일이 생성된다. 텍스트 파일의 문자열을 저장하는 인코딩 방식은 UTF-8로 다르지만 파일 뷰어에서는 결과가 동일하게 보이다.



F. UTF-8 형식으로 텍스트 파일 쓰기

다음은 UTF-8 형식으로 인코딩하여 한글을 줄 단위로 쓰는 예제이다. UTF-8은 다국어 등 영어 이외의 문자들을 표현하기 위해 개발된 가변 길이 인코딩 방식이다.

[예제 6- 39] 리스트를 줄 단위로 파일에 쓰기

# [1] 문장 리스트
sentences = ["다른 문을 열어 따라갈 필요는 없어",
             "넌 너의 길로, 난 나의 길로, 음음",
             "하루하루마다 색이 달라진 느낌",
             "밝게 빛이 나는 길을 찾아",
             "I'm on my way, 넌 그냥 믿으면 돼",
             "I'm on my way, 보이는 그대로야"
             "너는 누군가의 dreams come true",
             "제일 좋은 어느 날의 데자뷔",
             "머물고픈 어딘가의 낯선 뷰",
             "I'll be far away, that's my-"]

# [2] 파일 오픈
with open('i_am3.txt', 'wt', encoding='UTF-8') as f:
    # [3] 문장 리스트 반복
    for i, sentence in enumerate(sentences):
        # [4] 문장 단위 파일 쓰기
        f.write(f"[{i+1}] {sentence}" + '\n')

[결과] i_am3.txt 파일

[1] 다른 문을 열어 따라갈 필요는 없어
[2] 넌 너의 길로, 난 나의 길로, 음음
[3] 하루하루마다 색이 달라진 느낌
[4] 밝게 빛이 나는 길을 찾아
[5] I'm on my way, 넌 그냥 믿으면 돼
[6] I'm on my way, 보이는 그대로야너는 누군가의 dreams come true
[7] 제일 좋은 어느 날의 데자뷔
[8] 머물고픈 어딘가의 낯선 뷰
[9] I'll be far away, that's my-

위 소스 코드를 실행하면 ‘i_am3.txt’ 파일이 UTF-8 형식으로 생성된다.