본문 바로가기
Python 코딩도장

파이썬 코딩도장 Unit 27 정리(2) - 문자열 여러 줄을 파일에 쓰고 읽기

by chanfficial 2022. 2. 15.

2. 문자열 여러 줄을 파일에 쓰기, 읽기\

 

2-1. 반복문으로 문자열 여러 줄을 파일에 쓰기

  • 문자열 한 줄을 파일에 쓰는 것 처럼 문자열 여러 줄은 반복문을 사용하면 된다.
    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 을 붙이지 않으면 문자열이 모두 한 줄로 붙어서 출력된다.

 

 

2-2. 리스트에 들어있는 문자열을 파일에 쓰기

  • 리스트에 들어있는 문자열을 파일에 쓰려면 아래와 같이 작성해야 한다.
    파일객체.writelines(문자열리스트)​
  • writelines 는 리스트에 들어있는 문자열을 파일에 쓴다.
    lines = ['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']
     
    with open('hello.txt', 'w') as file: # hello.txt 파일을 쓰기 모드(w)로 열기
        file.writelines(lines)
        
    # 출력
    안녕하세요.
    파이썬
    코딩 도장입니다.​
  • writelines 를 사용할 때는 반드시 리스트의 각 문자열 끝에 개행 문자 \n 을 붙여줘야 하고, 그렇지 않으면 문자열이 모두 한 줄로 붙어서 저장된다.

 

 

2-3. 파일의 내용을 한 줄씩 리스트로 가져오기

  • read는 파일의 내용을 읽어서 문자열로 가져오지만 readlines 는 파일의 내용을 한 줄씩 리스트 형태로 가져온다.
    변수 = 파일객체.readlines()​
    with open('hello.txt', 'r') as file:    # hello.txt 파일을 읽기 모드(r)로 열기
        lines = file.readlines()
        print(lines)
        
    # 출력
    ['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']​

2-4. 파일의 내용을 한 줄씩 읽기

  • 파일의 내용을 한 줄씩 순차적으로 읽으려면 readline 을 사용한다.
    변수 = 파일객체.readline()​
  • 파일에 문자열이 몇 줄이나 있는지 모르기 때문에, readline 으로 파일을 읽을 때는 while 반복문을 활용해야 한다.(while은 특정 조건이 만족할 때 계속 반복하므로 파일의 크기에 상관없이 문자열을 읽어올 수 있다.)
    with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
        line = None  # 변수 line을 None으로 초기화
        while line != '':
            line = file.readline()
            print(line.strip('\n')) # 파일에서 읽어온 문자열에서 \n 삭제하여 출력
            
    # 출력
    안녕하세요.
    파이썬
    코딩 도장입니다.​
  • readline 은 더 이상 읽을 줄이 없을 때 빈 문자열을 반환하는데, while에서 이런 특성을 이용하여 조건식을 만들어준다.(즉, line != '' 와 같이 빈 문자열이 아닐 때 계속 반복하도록 만듦)
  • 반복문 안에서는 line = file.readline() 과 같이 문자열 한 줄을 읽어서 변수 line에 저장해주면 된다.
  • 특히 변수 line은 while로 반복하기 전에 None으로 초기화해줬는데 만약 line을 만들지 않고 while을 실행하면 없는 변수와 빈 문자열 '' 을 비교하게 되므로 에러가 발생하며, line을 None이 아닌 '' 로 초기화하면 처음부터 line != '' 는 거짓이 되므로 반복을 하지 않고 코드가 그냥 끝나버린다.
       line = None    # 변수 line을 None으로 초기화
        while line != '':​
  • 문자열을 출력할 때는 print(line.strip('\n') 과 같이 strip 메서드로 \n을 삭제했는데, 이는 파일에서 읽어온 문자열에 '안녕하세요. \n' 과 같이 \n이 이미 들어있기 때문이다. 
  • 만약 strip('\n') 을 생략하면, 문자열 안에 든 \n과 print가 출력하는 \n때문에 줄바꿈이 두 번 일어나서, 문자열 한 줄을 출력할 때마다 빈 줄이 계속 출력된다.

 

 

2-5. for 반복문으로 파일의 내용을 줄 단위로 읽기

  • for 반복문에 파일 객체를 지정하여 줄 단위로 파일의 내용을 읽을 수 있다.(좀 더 간단한 방법)
    with open('hello.txt', 'r') as file:  # hello.txt 파일을 읽기 모드(r)로 열기
        for line in file:  # for에 파일 객체를 지정하면 파일의 내용을 한 줄씩 읽어서 변수에 저장함
            print(line.strip('\n'))  # 파일에서 읽어온 문자열에서 \n 삭제하여 출력
            
    # 출력
    안녕하세요.
    파이썬
    코딩 도장입니다.​
    - for line in file: 로 간단하게 파일의 내용을 한 줄씩 읽었다.
  • for 반복문에 파일 객체를 지정하면 반복을 할 때마다 파일의 내용을 한줄씩 읽어서 변수에 저장해준다.

 

 

※ 파일 객체는 이터레이터

  • 파일 객체는 이터레이터이므로 변수 여러 개에 저장하는 언패킹(unpacking)도 가능하다.
    >>> file = open('hello.txt', 'r')
    >>> a, b, c = file
    >>> a, b, c
    ('안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n')​
  • 물론 a, b, c = file 과 같이 사용하려면 hello.txt 에는 문자열이 3줄 들어있어야 한다.(즉, 할당할 변수의 개수와 파일에 저장된 문자열 줄의 수가 일치해야 함)