본문 바로가기

고수준 파일연산과 저수준 파일연산 ( Python ) 본문

카테고리 없음

고수준 파일연산과 저수준 파일연산 ( Python )

jaegomhoji 2024. 6. 11. 14:34

저수준 파일 연산 : 파일 시스템의 기본 기능을 직접 다루는 작업을 의미

[특징] 

- 직접 제어 : 파일과 디렉토리에 대한 직접적인 접근과 제어를 가능하게 함

                 - 운영체제의 커널이 제공하는 시스템 호출을 직접 사용하여 파일을 읽어와서 신속함. 

                                   - 열린 파일을 참조할 때 파일 기술자 file descriptor 사용 : fd를 사용하여 파일에 대한 작업 수행. 

 

- 세부적 처리 : 각종 파일 시스템 호출을 세밀하게 처리 가능

- 에러 관리 : 직접 에러 처리해야 함

- 복잡성 : 고수준 연산보다 코드가 더 복잡하고 길어질 수 있음

- POSIX 표준에서는 주로 내장된 os함수의 open, read, write, close 메소드 등을 사용한다. 

 

그렇지만, 다음과 같은 코드는 open을 사용하더라도, 파일 객체를 사용하기 때문에 고수준 파일 연산이다. 

# 파일 객체 사용
with open(src, 'r') as foo:
    content = foo.read() # 파일 내용 읽기
    print(content)

 

아래는 파일 기술자를 사용하는 저수준 파일 연산

import os

# 파일 기술자 사용
fd = os.open(src, os.O_RDONLY)  # 파일 열기 (파일 기술자를 반환)
content = os.read(fd, 100)  # 최대 100 바이트 읽기
print(content)
os.close(fd)  # 파일 닫기

 

고수준 파일 연산 : 파일 및 디렉토리 작업을 추상화하여 직관적이고 사용하기 쉽게 만든 함수

[이점] 

- 사용 편의성

- 코드 가독성 : ex) shutil.move(src,dst)는 파일 이동 작업임을 코드로 명확히 알 수 있다.  

- 에러 처리의 안정성 : 고수준 함수는 에러처리를 포함하여 작업을 수행해서 사용자가 편하다. 

- 재사용성 : 표준 라이브러리의 고수준 함수는 다양한 상황에서 재사용할 수 있어서 개발 시간이 절약된다. 

- 파이썬에서는 주로 shutil 등의 함수를 사용한다. 

 

정리 

저수준 파일 연산은 보다 세밀하고 정밀한 파일 조작이 필요할 때 유용하지만, 고수준 파일 연산은 코드의 간결성과 편리성을 제공하기 때문에 일반적인 파일 작업에서는 더 자주 사용됩니다.

 

shutil 파이썬 공식 문서 링크 

https://docs.python.org/ko/3.11/library/shutil.html

 

shutil — High-level file operations

Source code: Lib/shutil.py The shutil module offers a number of high-level operations on files and collections of files. In particular, functions are provided which support file copying and removal...

docs.python.org

 

< 유의할 점 >

shutil은 파일의 메타 데이터를 복사하지 않는다. ex) ACL, 그룹 등 

  • POSIX ( 리눅스, 유닉스 ), Mac, WIndows 모두 해당한다. 
  • ACL (Access Control List): 파일에 대한 상세한 권한 설정을 나타냅니다. 예를 들어, 특정 사용자나 그룹이 파일에 대해 어떤 권한을 가지고 있는지를 정의합니다. 이 정보가 복사되지 않습니다. -> 접근 권한 
  • 파일 소유자 및 그룹: 파일의 소유자와 그룹 정보가 복사되지 않습니다. 원본 파일의 소유자와 그룹 설정이 새로운 파일에는 반영되지 않습니다.

 

이상 딥러닝 배포 프레임워크에서 shutil.rmtree로 이미지와 annotation temp폴더를 지우는 이유를 알아보았다. 

 

 os.system(권한부여 + "rm -rf " + folder_path)

- 코드가 길어진다

os.rmdir()

- 빈 디렉토리만 지울 수 있다. 

import shutil
shutil.rmtree(src, ignore_errors=True)
Comments