Programming Language/Python

[Python] 15. 파일 입출력(FILE Input/Output)

lumana 2023. 11. 6. 01:02

파일 입출력(FILE I/O)


파일 다루기 : open() 함수


  • open 함수 원형

    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    • file 매개변수는 반드시 명시적으로 밝혀줘야 함

    • file : 파일 Directory

    • 파일 열기 모드

      • r : 읽기 모드

        • 파일을 읽기만 할 때 사용
      • w : 쓰기 모드

        • 파일에 내용을 쓸 때 사용

        • 해당 파일이 이미 존재하는 경우 내용이 모두 사라지고(truncate)

        • 파일이 없으면 새로 생성됨

        • 특정 경로에 생성하고 싶으면 디렉토리까지 적어주자.

      • a : 추가 모드

        • 파일의 마지막에 새로운 내용을 추가할 때 사용
      • x : 베타적 생성 모드(O_EXCL)

        • 파일이 이미 존재하고 있는 경우 실패
      • b : 2진(바이너리) 모드

      • t : 텍스트 모드

      • +: 업데이트를 위한 디스크 파일 열기

    • 버퍼링

      • 0 : 버퍼링 사용하지 않음(바이너리 모드만 지원)

      • 1: 개행 문자를 만날때 까지 버퍼링(라인 버퍼링, 텍스트 모드에서 지원)

      • 1 이상의 임의의 수 : 임의의 값으로 버퍼의 크기를 직접 설정하고 싶을 때

    • 인코딩(텍스트 모드)

      • 파일 인코딩, 디코딩 할 때 사용되는 format
    • erros (인코딩 할 때 에러 처리 옵션)

  • 파일을 open하면 반드시 close 해야함

    f = open("new_file.txt", 'w') # 파이썬 내장함수 open(파일이름, 파일 열기 모드)
    f.close()
    • 열려 있는 파일 객체를 닫아 주는 역할을 함

      • close()를 생략해도 자동으로 닫아주긴 하지만 쓰기 모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생함.

파일 쓰기


  • FILE객체의 write()메소드를 사용해 파일 쓰기

    f = open("new_file.txt", 'w') # write mode
    for i in range(1, 11):
        data = "%d번째 줄입니다.\n" % i
        f.write(data)
    f.close()
  • print()는 프롬프트(터미널, 콘솔)에, f.write는 파일에 value를 출력

  • f.write()의 return value : 문자의 수

파일 읽기


  • read() 메소드

    • read(n) : 현재 위치에서 n개의 글자만 읽음
    • seek(n) : 현재 위치를 n번째 위치로 설정
    f = open('text.txt', 'r')
    lines = f.read() # 파일의 모든 내용을 읽기
    
    str = f.read(10) # 처음부터 10개의 글자를 읽어서 저장
    str2 = f.read(20) # 마지막으로 읽은 글자 다음부터 20개의 글자를 읽어서 저장 
    
    f.seek(0) # current position를 처음으로 설정
  • readline() 메소드

    • 한 줄 읽기
    • 데이터가 \n이 나올 때 까지 읽기
    • 리턴 값이 \n이 포함되어 있음 --> 여러번 print 실행 시 두 줄 사이에 empty line이 있음
    f = open("new_file.txt", 'r')
    while True:
      line = f.readline() # 더 이상 읽을 줄이 없으면 None을 출력한다.
      if not line: break
      print(line)
    f.close()
  • readlines() 메소드

    • 모든 line을 읽어 리스트에 line별로 각각 저장
    f = open("new_file.txt", 'r')
    lines = f.readlines() # readlines 함수는 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트로 돌려줌.
    for line in lines:
      print(line)
    f.close()
  • FILE 객체의 Iterable 특성을 이용해 읽기

    • read와 관련된 함수를 사용하지 않고 파일 읽기
      f = open('text.txt', 'r')
      for line in f: # for 문을 통해 라인별로 읽기
        print(line)
      f.close()

파일에 새로운 내용 추가하기


  • 기존에 있는 내용을 살리고 새로운 값만 추가하고 싶을때 사용

  • 추가모드 'a'로 열면 됨

    f = open("new_file.txt", 'a')
    for i in range(11, 20):
      data = "%d 번째 줄입니다.\n" % i
      f.write(data)
    f.close()
    • write() 대신 writelines() 메소드의 매개변수로 리스트를 넘겨 추가할 수도 있다.

with문과 함께 사용하기


  • with문을 사용하여 파일을 열고 닫는 걸 자동으로 처리

    with open("foo.txt", 'w') as f:
      f.write("Life is too short, you need python")
    • with 블록을 벋어나는 순간 f가 자동으로 close 된다.
  • with문에서 두개의 open 함수를 이어 붙일 때 백슬래시() 사용

    with open("fii.txt", 'w') as fi, \
      open("foo,txt", 'r') as fo:

sys 모듈로 매개변수 주기


  • 파일을 실행할 때 다음과 같이 실행함

    • (명령 프롬프트 명령어) [인수1 인수2 ...]
    import sys
    args = sys.argv[1:]
    for i in args:
      print(i)
    • sys 모듈의 argv는 명령창에서 입력한 인수를 의미.
    • argv[0]는 파일 이름 sys1.py가 되고, argv[1]부터 나오는 인수가 argv의 요소가 된다.

참조) Do it! 점프 투 파이썬 (박응용 지음), https://wikidocs.net (파이썬 계단밟기)