Python(파이썬) 기본 - 47. 파일 - 텍스트 파일 다루기

아래 내용은 공부한 것을 정리하므로 틀린 내용이 포함되어 있을 수 있습니다.

1. 파일 다루기 기본

  • 파이썬에서 파일 다룰 때는 기본 내장함수 open() 함수를 활용합니다.
  • open() 함수의 사용법
  • 첫번째 인수 file경로만이 필수입니다.
      open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    
  • open() 함수 인자, 자주 사용하는 것만 살펴봅니다.
    • file : 파일 경로
    • mode : 파일이 열리는 모드
      • ‘r’ : 읽기 용으로 열림 (기본값)
      • ‘w’ : 쓰기 위해 열기, 파일을 먼저 자른다.
      • ‘x’ : 베타적 생성을 위해 열리고, 이미 존재하는 경우 실패
      • ‘a’ : 쓰기를 위해 열려 있고, 파일의 끝에 추가하는 경우 추가합니다.
      • ‘b’ : 2진 모드(바이너리 모드)
      • ‘t’ : 텍스트 모드 (기본값)
      • ’+’ : 업데이트 (읽기 및 쓰기)를 위한 디스크 파일 열기
      • ‘U’ : 유니버설 개행 모드 (사용되지 않음)
    • buffering : 버퍼링끄기는 0(바이너리모드에서만 동작함), 라인모드는 1 (텍스트 모드에서만 가능), 고정 크기로 보내려면 임의의 바이트수를 1보다 큰 양의 수로 입력, 기본 정책은 아래와 같습니다.
      • 이진 파일은 고정 크기 청크로 버퍼링됩니다. 버퍼의 크기는 기본 장치의 “블록 크기”를 결정하고 다시 떨어지는 경험적 방법을 사용하여 선택됩니다 io.DEFAULT_BUFFER_SIZE. 많은 시스템에서 버퍼는 일반적으로 4096 또는 8192 바이트 길이입니다.
      • “대화식”텍스트 파일 ( isatty() 반환 되는 파일 True)은 회선 버퍼링을 사용합니다. 다른 텍스트 파일은 바이너리 파일에 대해 위에서 설명한 정책을 사용합니다.
    • encoding : 파일을 디코딩하거나 인코딩하는데 사용되는 이름, 대부분 utf-8 이지만 모든 시스템이 utf-8이라는 보장이 없으므로 명시적으로 하는 것이 좋다.
  • 파일 객체는 반드시 열고 작업이 완료되면 반드시 파일을 닫아야 합니다.
  • 파일을 닫지 않으면 버퍼링되어 있는 데이터는 기록되지 않고 소실될 수 있습니다.
  • **file 객체의 close()메소드로 파일을 닫습니다. **

2. 파일 쓰기

  • 파일 쓰기를 수행해봅니다.
  • REPL에서 수행해봅니다.

  • 파일을 작성하기 위해서는 새로운 파일을 open 해야합니다.
  • mode='wt'라고 되어 있는 부분은 쓰기모드이면서 텍스트모드를 가리킵니다.
  • mode를 작성할 때 r(읽기), w(쓰기), a(추가하기) 세가지중 하나와 t(텍스트)b(바이너리) 둘중 하나와 반드시 결합해야하며, 나머지는 optional하게 사용가능합니다.
  • 인코딩을 명시적으로 기입하였습니다.
  • help메소드로 file객체의 여러사용할 수 있는 메소드를 볼 수 있습니다.
      >>> f = open('test.txt', mode='wt', encoding='utf-8')
      >>> help(f)    
    
  • 작성해봅니다.
  • write의 반환은 바이트수가 아닌 문자열 수입니다.
  • 작성이 끝나면 반드시 close() 메소드를 호춣해야 합니다.
      >>> f.write('파이썬으로 파일을 작성하고 있습니다.')
      20
      >>> f.write('newline 문자로 개행해봅니다.\n')
      20
      >>> f.write('개행이 잘되었나요?')
      10
      >>> f.close()
    
  • REPL을 빠져나와 vi 에디터로 오픈해봅니다.
      $ vi test.txt
    

3. 파일 읽기

  • 파일 읽기를 수행해봅니다.
  • mode는 mode='rt' 입니다.
  • read(글자수)로 파일을 읽습니다.
  • 파일을 읽고 나서 내부 포인터는 읽은 마지막 끝으로 이동됩니다.
      >>> r = open('test.txt', mode='rt', encoding='utf-8')
      >>> r.read(10)
      '파이썬으로 파일을 '
    
  • 파일을 읽고 내부포인터가 읽은 마지막 끝으로 이동되었다는 의미는 read를 한번 더 실행하면 확인할 수 있습니다.
  • 첫번째 다음 10글자를 읽었습니다.
      >>> r = open('test.txt', mode='rt', encoding='utf-8')
      >>> r.read(10)
      '파이썬으로 파일을 '
      >>> r.read(10)
      '작성하고 있습니다.'
    
  • 나머지 문자를 읽어보겠습니다.
  • 다 읽은 후에는 빈 문자가 반환됩니다.
     >>> r.read(50)
     'newline 문자로 개행해봅니다.\n개행이 잘되었나요?'
     >>> r.read(50)
     ''
    
  • 다시 포인터를 맨 앞으로 가져가려면 seek(포인터위치) 메소드를 사용합니다.
  • 맨 앞이기 때문에 인자를 0으로 입력합니다.
      >>> r.seek(0)
      0
    
  • 파일 내용 전체를 리턴받으려면 read메소드를 인수 없이 사용합니다.
      >>> r.read()
      '파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다.\n개행이 잘되었나요?'
    
  • 다시 포인터를 0으로 위치시킵니다.
      >>> r.seek(0)
      0
    
  • 이제는 readline()메소드로 line 별로 읽어봅니다.
      >>> r.readline()
      '파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다.\n'
      >>> r.readline()
      '개행이 잘되었나요?'
      >>> r.readline()
      ''
      >>> 
    
  • readlines() 메소드는 파일의 라인별로 리스트 형태로 리턴합니다.
      >>> r.seek(0)
      0
      >>> r.readlines()
      ['파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다.\n', '개행이 잘되었나요?']
      >>> r.close() 
    

4. 파일 추가하기

  • 파일 추가를 수행해봅니다.
  • mode는 mode='at' 입니다.
    >>> a = open('test.txt', mode='at', encoding='utf-8')
    >>> a.writelines(['writelines로 추가합니다.', '내부 원소는 개행이 안되는군요.', '개행을 하려면 개행문자를 입력해야합니다.\n', '마지막에는 안붙여도 개행문자가..'])
    >>> a.close()
    
  • 결과는
      파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다.
      개행이 잘되었나요?writelines로 추가합니다.내부 원소는 개행이 안되는군요.개행을 하려면 개행문자를 입력해야합니다.
      마지막에는 안붙여도 개행문자가..
    

5. Iterable한 파일 객체의 특성을 이용한 읽기

  • iterable한 객체임을 확인합니다.
      >>> import collections
      >>> r = open('test.txt', mode='rt', encoding='utf-8')
      >>> isinstance(r, collections.Iterable)
      True
    
  • for문을 통해 라인별로 읽습니다.
      >>> for line in r:
      ...     print(line)
      >>> r.close()
    
  • print 문에 의해 한번 씩 추가로 개행이 되었습니다.
      파이썬으로 파일을 작성하고 있습니다.newline 문자로 개행해봅니다.
        
      개행이 잘되었나요?writelines로 추가합니다.내부 원소는 개행이 안되는군요.개행을 하려면 개행문자를 입력해야합니다.
        
      마지막에는 안붙여도 개행문자가..