macOS X의 사진 라이브러리의 실제 데이터를 뽑아보도록 하겠습니다.
일의 시작
지금까지 집에서는 iMac을 기본 기계로 삼았지만 다양한 Macbook Pro 일체화가 있었다.
iMac에는 아내가 찍은 사진이 100GB 정도 있습니다.하지만 MacbookPro의 SSD는 256GB입니다.
iMac은 자리를 차지해야 하기 때문에 놓을 수 없다. 갑자기 사진을 삭제하는 것은 여러 가지 의미에서 리스키이기 때문에 외부 저장소에 넣기로 했다.
MacOS X 사진 라이브러리
우선 사진들이 원래 어디에 있었는지, 아무것도 하지 않았다면
ホームディレクトリ
>ピクチャ
.이것
写真ライブラリ.photoslibrary
은 사진들이고, 이것Finder
에서 보면 폴더가 아니며, 두 번 클릭하면写真アプリ
이 시작됩니다.이 내용을 보려면
右クリック
>パッケージの内容を表示
을 보실 수 있습니다.(종착역이라면 일반
cd
입장)폴더가 많습니다.글쎄, 샘넬라는 DB를 검색했고, 사진 앱을 편안하게 이용하기 위해 다양한 데이터를 저장했다.
그렇다면 관건적인 실제 데이터들
Masters
> 年
> 月
> 日
> 年月日-何かのインデックス
> xxx.PNG의 명세란 스타일에 정의된 설정입니다.
층이 너무 깊기 때문에 사진 응용 프로그램에서는 아무런 문제가 없고 사진을 한눈에 볼 수 있지만 직접적으로 보면 상당히 번거로워진다.만사달 폴더 이외에는 다른 일이 없기 때문에 저장을 절약하고 싶다.
하고 싶은 일
그래서 오프닝이 많이 길어졌어요. 이번에 하고 싶은 건 여기예요.
-
年
> 月
> xxx.PNG 계층으로 좁혀져 사진 어플리케이션을 거치지 않고도 사진을 열람하고 싶어하는 사람들- (가능하면) 구글 사진에 넣어서 클라우드를 통해서 보고 싶어요.
파이썬으로 간단한 PG를 썼어요.
하는 일은 간단하다.여분의 파일 (숨겨진 파일 등) 을 피하면서 원하는 폴더 구성에 따라 복사합니다.이것밖에 없어요.
extract.py
import os, re, shutil
from os.path import join
def extract():
rootPath = "path to source images(Masterフォルダ)"
copyto = "path to destination(コピー先フォルダ)"
if not os.path.isdir(copyto):
os.makedirs(copyto)
cnt = 0
# year
for year in list( \
filter( \
lambda yearDir: re.match("^20[0-9]{2}$", yearDir) <= int(yearDir), os.listdir(rootPath) \
)):
# month
for month in list( \
filter( \
lambda monthDir: re.match("^[0-9]{2}$", monthDir) <= int(monthDir), os.listdir(join(rootPath, year)) \
)):
for root, dirs, files in os.walk(join(rootPath, year, month)):
if len(files) != 0:
for file in list( \
filter( \
lambda file: re.match("^[^.].*", file), files \
)):
print("copy", join(root,file), "to", join(copyto, year, month, file))
if not os.path.isdir(join(copyto, year, month)):
# ディレクトリなければ作る
os.makedirs(join(copyto, year, month))
shutil.copy2(join(root,file), join(copyto, year, month, file))
cnt += 1
else:
print("copied", cnt, "files")
if __name__ == "__main__":
extract()
프로그램의 전체 버전은 여기에 있습니다.https://github.com/vira0223/extract_files
굳이 열거하자면, 요점은 두 가지다.
① 정규 표현식
아주 간단한 녀석이지만 정규 표현식을 사용해서 필요 없는 목록을 읽지 않는다.
^20[0-9]{2}$
: 2009, 2018 등 달력의 폴더 이름만 대상으로 합니다.90년대에 나는 몰랐다.^[^.].*
: .
부터 숨겨진 파일을 제외합니다..DS_Store
같은 거.② 람다식
Python은 순환 처리와if문장을 혼합할 때 어떻게든 단계를 깊이 있게 하기 쉽다.
이번에는 람다식을 사용했기 때문에 3, 4층은 얕다고 생각합니다.
lambda
list( \ ..a
filter( \ ..b
lambda yearDir: re.match("^20[0-9]{2}$", yearDir) <= int(yearDir), os.listdir(rootPath) \ ..c
)):
os.listdir()
를 원본 집합(목록)으로 하고 c
와 일치하는 요소만 필터링b
하고 서브집합(목록)으로 되돌려줍니다.실행 결과
네.기대했던 대로.
총결산
참고 자료
[인쇄] 파일/디렉토리 작업
https://qiita.com/supersaiakujin/items/12451cd2b8315fe7d054
[Python 입문] 람다(람다식)의 사용법
https://www.sejuku.net/blog/23677
Reference
이 문제에 관하여(macOS X의 사진 라이브러리의 실제 데이터를 뽑아보도록 하겠습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/obr_y/items/86796df01945efc4be51텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)