파이썬 파일

2021. 8. 24. 13:18·Python/Syntax
목차
  1. 파일 입출력
  2. 파일 열기
  3. 파일 쓰기
  4. 파일 읽기
  5. 입출력 위치
  6. 내용 추가
  7. 파일 관리
  8. 참고

파일

파일 입출력

  • 윈도우에서는 파일 경로를 구분할 때 \\로 작성하는게 맞지만, 파이썬에서는 /를 쓰더라도 처리해주므로 OS에 독립적으로 작성할 수 있다.

파일 열기

  • open(파일경로, 모드[, encoding="문자셋"])

  • 모드

    모드 설명
    r 읽기, 파일이 없는 경우 예외 발생
    w 쓰기, 파일이 없으면 새로 생김
    a 추가
    x 쓰기용으로 여나 기존 파일이 있는 경우 실패
    t text 모드로 열기 (기본값)
    b binary 모드로 열기

파일 쓰기

  • write(데이터)

    f = open("live.txt", "wt", encoding="UTF-8")
    
    f.write("""삶이 그대를 속일지라도
    슬퍼하거나 노하지 말라!
    우울한 날들을 견디면
    믿으라, 기쁨의 날이 오리니""")
    f.write("\n추가1")
    f.write("\n추가2")
    f.write("\n추가3")
    
    f.close()

파일 읽기

  • 메서드

    메서드 설명
    .read() 파일 전체 내용
    .read(n) n개의 내용 (바이너리 모드일 땐 바이트, 텍스트 모드일 땐 글자 수)
    .readline() 한 줄 (끝에 개행 문자 포함)
    .readlines() 전체 라인 리스트 (각 라인 끝에 개행 문자 포함)
  • 예제

    • f를 처음에 None으로 대입해야 f.close()의 조건을 설정할 수 있다.

      try:
          f = None
          f = open("live.txtd", "rt", encoding="UTF-8")
          text = f.read()
          print(text)
      except FileNotFoundError:
          print("파일이 없습니다.")
      finally:
          if f:
              f.close()
      
      ''' stdout
      삶이 그대를 속일지라도
      슬퍼하거나 노하지 말라!
      우울한 날들을 견디면
      믿으라, 기쁨의 날이 오리니
      추가1
      추가2
      추가3
      '''
  • with

    • with 블록이 끝났을 때 해당 객체의 close()를 자동 호출한다.

    • I/O 처리나 통신 관련 작업 시 유용하다.

      try:
          with open("live.txt", "rt", encoding="UTF-8") as f:
              text = f.read()
              print(text)
      except Exception as e:
          print(e)
    • for 문에 바로 넣을 수도 있다.

      with open("live.txt", "rt", encoding="UTF-8") as f:
          for line in f:
              print(line, end="")

입출력 위치

  • .seek(위치, 기준)

    • 위치 (offset)

      • 기준으로부터 얼마나 떨어진 곳인지 바이트 단위로 지정한다.

      • 한글의 경우 주의해야 한다.

        • 얼라인이 맞지 않으면 UnicodeDecodeError 에러가 발생한다.

        • 따라서 주로 바이너리 파일을 다룰 때 사용한다.

    • 기준

      기준 설명
      0 파일의 처음 위치
      1 현재 위치
      2 파일의 끝 위치

    live.txt

    삶이 그대를 속일지라도
    슬퍼하거나 노하지 말라!
    우울한 날들을 견디면
    믿으라, 기쁨의 날이 오리니
    with open("live.txt", "rt", encoding="UTF-8") as f:
        f.seek(12, 0)
        text = f.read() # 예외 발생
  • .tell()

    • 현재 파일 포인터의 위치를 정수형으로 반환한다.

내용 추가

  • w 모드 (fp가 0)

    • 기존 파일이 존재하는 경우, 내용을 모두 지우고 다시 작성한다. (덮어쓰기)
  • a 모드 (fp가 파일의 끝)

    • 기존 파일이 존재하는 경우, 파일의 끝에 내용을 추가한다. (이어쓰기)

파일 관리

  • 파일 관리 함수

    함수 설명
    shutil.copy(a, b) 파일 복사
    shutil.move(a, b) 파일 이동
    shutil.rmtree(path) 디렉터리 트리 삭제(주의)
    shutil.chown(f, u, g) 소유자 변경
    os.rename(a, b) 이름 변경
    os.remove(f) 파일 삭제
    os.chmod(f, m) 권한 변경
    os.link(a, b) a를 가리키는 b라는 이름의 하드 링크 생성
    os.symlink(a, b) 심볼릭 링크 생성
  • 디렉토리 관리 함수

    함수 설명
    os.chdir(path) 현재 워킹 디렉토리를 path로 변경
    os.mkdir(path[, mode=0o777, dir_fd=None]) mode 권한으로 path 디렉터리를 생성
    os.rmdir(path[, dir_fd=None]) 디렉토리 path 제거
    os.getcwd() 현재 워킹 디렉토리 반환
    os.listdir(path='.') path 디렉토리에 있는 항목들의 이름을 담고 있는 리스트 반환, .와 ..는 포함하지 않음
    glob.glob(pathname) pathname(패턴)에 해당하는 파일 리스트 반환
    os.path.isabs(path) path가 절대 경로면 True
    os.path.abspath(path) path의 절대 경로를 반환
    os.path.realpath(path) path의 경로에서 심볼릭 링크를 제거해서 반환
    os.path.exists(path) path가 존재하는 경로나 열려있는 파일 디스크립터면 True
    os.path.isfile(path) path가 존재하고 일반 파일이면 True
    os.path.isdir(path) path가 존재하고 디렉토리이면 True
  • 예시

    • 디렉토리 관리

      import os
      from pprint import pprint
      
      # 지정한 확장명을 가지는 파일명 목록을 리턴하는 함수
      def get_files(dir_path, ext):
          files = os.listdir(dir_path)
          cwd = os.getcwd()
          print(f"cwd : {cwd}")
      
          # 0. 일반 순회
          file_list = []
          for f in files:
              fpath = os.path.join(cwd, f)
              print(fpath)
              if (os.path.isfile(fpath)) and (fpath.endswith(ext)):
                  file_list.append(fpath)
          return file_list
      
          # 1. filter 함수 적용 
          files = map(lambda fname: os.path.join(cwd, fname), files)
          file_list = list(filter(lambda fname: fname.endswith(ext), files))
          return file_list
      
          # 2. 컴프리헨션
          return [os.path.join(cwd, fname) for fname in files if fname.endswith(ext)]
      
      
file_list = get_files('.', '.txt')
pprint(file_list)
```

```py
# ---- 요구 사항 예시 ----
# 파일 목록
# 1) addressbook copy.txt
# 2) addressbook.txt
# 3) live.txt
# 4) live2.txt
# 5) memo.txt
#
# 파일 선택 : 3
# live.txt 내용을 출력
#
# 파일 선택 : -1
# 종료
# -----------------------

import os

def get_files(dir_path, ext):
    return [fname for fname in os.listdir(dir_path) if fname.endswith(ext)]


def print_file_list(files):
    print("\n\n--- 파일 목록 ---")
    for idx, fname in enumerate(files, 1):
        print(f"{idx}) {fname}")
    print()


def print_file(file_name):
    try:
        with open(file_name, "rt", encoding="UTF-8") as f:
            text = f.read()
            print(text)
    except Exception as e:
        print(e)


while (True):
    txt_list = get_files('.', '.txt')
    print_file_list(txt_list)
    selected_no = int(input("파일을 선택하세요 : "))
    if (selected_no == -1):
        print("종료합니다.")
        break
    print_file(txt_list[selected_no - 1])
```

참고

  • https://docs.python.org/ko/3/library/os.html
저작자표시 (새창열림)

'Python > Syntax' 카테고리의 다른 글

파이썬 고급 문법  (0) 2021.08.24
파이썬 모듈과 패키지  (0) 2021.08.24
파이썬 예외 처리  (0) 2021.08.24
파이썬 표준 모듈  (0) 2021.08.24
파이썬 컬렉션 관리  (0) 2021.08.24
  1. 파일 입출력
  2. 파일 열기
  3. 파일 쓰기
  4. 파일 읽기
  5. 입출력 위치
  6. 내용 추가
  7. 파일 관리
  8. 참고
'Python/Syntax' 카테고리의 다른 글
  • 파이썬 고급 문법
  • 파이썬 모듈과 패키지
  • 파이썬 예외 처리
  • 파이썬 표준 모듈
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 분류 전체보기 (317)
      • Algorithm (13)
        • 알기 쉬운 알고리즘 (10)
        • Search (1)
        • Sort (2)
      • Arduino (0)
      • C++ (185)
        • Class (46)
        • Exception (6)
        • Library (51)
        • Overloading (10)
        • SmartPointer (5)
        • Syntax (33)
        • TBC++ (23)
        • Templates (9)
        • VisualStudio (2)
      • Embedded (1)
      • Git (4)
      • Java (5)
      • Linux (16)
        • Error (1)
        • Linux Structure (11)
      • MacOS (7)
      • OS (1)
        • Concurrency (1)
      • Python (21)
        • Class (1)
        • Function (2)
        • Syntax (17)
      • Raspberrypi (9)
      • Review (1)
      • Utility (12)
        • VSCode (5)
        • VirtualBox (3)
      • Web (8)
        • Nginx (1)
        • React (3)
        • Django (1)
      • Windows (20)
        • Registry (3)
        • WSL (1)
        • DeviceDriver (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SFC
    spring
    알림
    스프링
    Solaris 10
    제외
    MacOS
    vscode
    윈도우 명령어
    SunOS 5.1
    Windows 11
    그림판
    시스템 복구
    mspaint
    맥북 카카오톡 알림 안뜸
    백기선
    dism
    로지텍 마우스 제스처
    KakaoTalk
    citrix workspace
    windows
    스프링 프레임워크 핵심 기술
    logi options
    Workspace
    java
    unix
    EXCLUDE
    윈도우
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Caniro
파이썬 파일

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.