Django 소스 베이스 5 - utils에서 archive 기술을 깊이 학습
_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
공장 방법
컨텍스트 관리
배울 만하네.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.