Django 소스 베이스 5 - utils에서 archive 기술을 깊이 학습

3996 단어
Django 원본에서 utils는 이 도구 모음을 제공합니다.프레임과의 교차가 많지 않다.아무래도 이걸로 대신의 코드를 배워보는 게 좋을 것 같습니다.
_os 부분에서 폴더 처리 함수를 제공합니다. 건너뜁니다.계속해서 archive 모듈을 보십시오. 이 모듈은 주로 압축 해제 파일 처리를 제공합니다.
우선main 코드는 다음과 같습니다
from django.utils import archive

archive.extract('/Users/watsy/Downloads/Archive.zip','/Users/watsy/Downloads/Archive/')

extract 코드는 다음과 같습니다
def extract(path, to_path=''):
    """
    Unpack the tar or zip file at the specified path to the directory
    specified by to_path.
    """
    with Archive(path) as archive:
        archive.extract(to_path)

extract 압축 해제 코드는Archive 상하문을 통해 압축 파일을 열고 경로로 압축하는 것을 알 수 있다
계속해서 Archive 부분 코드를 보십시오.
class Archive(object):
    """
    The external API class that encapsulates an archive implementation.
    """
    def __init__(self, file):
        self._archive = self._archive_cls(file)(file)

    @staticmethod
    def _archive_cls(file):
        cls = None
        if isinstance(file, six.string_types):
            filename = file
        else:
            try:
                filename = file.name
            except AttributeError:
                raise UnrecognizedArchiveFormat(
                    "File object not a recognized archive format.")
        base, tail_ext = os.path.splitext(filename.lower())
        cls = extension_map.get(tail_ext)
        if not cls:
            base, ext = os.path.splitext(base)
            cls = extension_map.get(ext)
        if not cls:
            raise UnrecognizedArchiveFormat(
                "Path not a recognized archive format: %s" % filename)
        return cls

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.close()

    def extract(self, to_path=''):
        self._archive.extract(to_path)

    def list(self):
        self._archive.list()

    def close(self):
        self._archive.close()

여기서enter__ 및exit__ 지난 1편에서 언급한 바와 같이 상하문 관리용이다.
extract와list부분은 통과archive 속성에 대응하는 방법 처리.
중점 분석archive_cls 방법
먼저 전송된 파일의 이름이 문자열인지 확인하십시오.다음에 경로와 접미사 이름을 분해합니다
사전 판단과 접두사 이름을 통해 대응하는 압축 해제 처리 클래스의 대상을 얻다
extension_map = {
    '.tar': TarArchive,
    '.tar.bz2': TarArchive,
    '.tar.gz': TarArchive,
    '.tgz': TarArchive,
    '.tz2': TarArchive,
    '.zip': ZipArchive,
}

init에서 처리 파일 대상을 받은 후 에 실례화 (전송 파일 경로)archive 등록 정보.
이 예시 호출 대상의 클래스는
class ZipArchive(BaseArchive):

    def __init__(self, file):
        self._archive = zipfile.ZipFile(file)

    def list(self, *args, **kwargs):
        self._archive.printdir(*args, **kwargs)

    def extract(self, to_path):
        namelist = self._archive.namelist()
        leading = self.has_leading_dir(namelist)
        for name in namelist:
            data = self._archive.read(name)
            if leading:
                name = self.split_leading_dir(name)[1]
            filename = os.path.join(to_path, name)
            dirname = os.path.dirname(filename)
            if dirname and not os.path.exists(dirname):
                os.makedirs(dirname)
            if filename.endswith(('/', '\\')):
                # A directory
                if not os.path.exists(filename):
                    os.makedirs(filename)
            else:
                with open(filename, 'wb') as outfile:
                    outfile.write(data)

    def close(self):
        self._archive.close()

通过__init__방법 우선 할당archive는 ZipFile 객체입니다.
close가 부모 클래스를 덮어쓰는 닫는 방법으로 상하문 종료를 처리합니다.
다음에extract에서 압축 해제 작업을 진행합니다.
압축 해제 부분 코드 논리는
1: 압축 패키지 내 파일 목록 가져오기
2: 파일 이름에 따라 경로 및 파일 처리 판단
위에서 분석
archive가 사용했다는 걸 알 수 있어요.
프록시 클래스 Archive
공장 방법
컨텍스트 관리
배울 만하네.

좋은 웹페이지 즐겨찾기