29.2 문자열 여러 줄에 파일에 쓰기, 읽기

이번에는 문자열 여러 줄을 파일에 써보겠습니다. 그러면 문자열 여러 줄은 어떻게 쓰면 될까요? 간단하게 반복문을 사용하면 됩니다.

file_for_write_string.py

with open('hello.txt', 'w') as file:    # hello.txt 파일을 쓰기 모드(w)로 열기
    for i in range(3):
        file.write('Hello, world! {0}\n'.format(i))

.py 파일이 있는 폴더의 hello.txt 파일을 열어보면 다음과 같은 내용이 저장되어 있습니다.

Hello, world! 0
Hello, world! 1
Hello, world! 2

파일에 문자열 여러 줄을 저장할 때 주의할 부분은 개행 문자 부분입니다. 'Hello, world! {0}\n'와 같이 문자열 끝에 개행 문자 \n를 지정해주어야 줄바꿈이 됩니다. 만약 \n을 붙이지 않으면 문자열이 모두 한 줄로 붙어서 저장됩니다.

이번에는 리스트에 들어있는 문자열을 파일에 저장해보겠습니다. 이때는 writelines를 사용합니다.

  • 파일객체.writelines(문자열리스트)

file_writelines.py

lines = ['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']
 
with open('hello.txt', 'w') as file:    # hello.txt 파일을 쓰기 모드(w)로 열기
    file.writelines(lines)

hello.txt

안녕하세요.
파이썬
코딩 도장입니다.

writelines를 사용할 때는 반드시 리스트의 각 문자열 끝에 개행 문자 \n을 붙여주어야 합니다. 그렇지 않으면 문자열이 모두 한 줄로 붙어서 저장됩니다.

이번에는 파일의 내용을 한 줄씩 읽어보겠습니다. read는 파일의 모든 내용을 읽어오지만 readlines는 한 줄씩 읽어서 리스트 형태로 가져옵니다..

  • 변수 = 파일객체.readlines()

file_readlines.py

with open('hello.txt', 'r') as file:    # hello.txt 파일을 읽기 모드(r)로 열기
    lines = file.readlines()
    print(lines)

실행 결과

['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']

파일의 내용을 한 줄씩 읽어서 리스트 형태로 가져왔습니다.

만약 파일의 내용을 한 줄씩 순차적으로 읽으려면 readline을 사용하면 됩니다.

  • 변수 = 파일객체.readline()
with open('hello.txt', 'r') as file:    # hello.txt 파일을 읽기 모드(r)로 열기
    line = file.readline()
    print(line.strip('\n'))        # 파일에서 읽어온 문자열에서 \n 삭제
    while line != '':
        line = file.readline()
        print(line.strip('\n'))    # 파일에서 읽어온 문자열에서 \n 삭제

실행 결과

안녕하세요.
파이썬
코딩 도장입니다.

readline을 사용할 때는 while 반복문을 활용해야 합니다. 먼저 readline으로 파일을 한 줄을 읽은 뒤에 while line != '':와 같이 빈 문자열이 아닐 때 계속 반복하도록 만듭니다. 그리고 반복문 안에서 다시 readline으로 한 줄씩 읽으면 됩니다. readline은 더 이상 읽을 줄이 없을 때는 빈 문자열을 반환합니다.

여기서 문자열을 출력할 때는 print(line.strip('\n')와 같이 strip 메서드로 \n을 삭제했습니다. 왜냐하면 파일에서 읽어온 문자열에는 '안녕하세요.\n'와 같이 \n이 이미 들어있기 때문입니다. 만약 strip('\n')을 생략하면 문자열 한 줄을 출력할 때마다 빈 줄이 계속 출력됩니다. 즉, 문자열 안에 든 \nprint가 출력하는 \n 때문에 줄바꿈이 두 번 일어납니다.

참고 | 파일 객체는 이터레이터

파일 객체는 이터레이터입니다. 따라서 for 반복문에 바로 사용할 수 있습니다(이터레이터는 'Unit 41 이터레이터 사용하기' 참조). 다음은 for를 사용하여 줄 단위로 파일의 내용을 출력합니다.

>>> file = open('hello.txt', 'r')
>>> for line in file:
...     print(line.strip('\n'))
...
안녕하세요.
파이썬
코딩 도장입니다.

물론 이터레이터라서 변수 여러 개에 저장하는 언패킹(unpacking)도 가능합니다.

>>> file = open('hello.txt', 'r')
>>>a, b, c = file
>>> a, b, c
('안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n')