macOS X의 사진 라이브러리의 실제 데이터를 뽑아보도록 하겠습니다.

11029 단어 MacPython

일의 시작


지금까지 집에서는 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하고 서브집합(목록)으로 되돌려줍니다.

실행 결과


네.기대했던 대로.

총결산

  • 요즘은 Java로 일하고 있습니다. Python은 오랜만입니다. 다시 공부할 수 있는 기회가 많습니다
  • 자바의 Stream 프로그래밍에 익숙해져서인지 파이썬의 lambda식 변주곡의 부족이 사람을 화나게 한다.그저 모른다면 그랬으면 좋겠다
  • Python 계층이 너무 깊음
  • 그래도 사소한 일을 쓰는 것이 편리하다.공부 열심히 하세요
  • 참고 자료


    [인쇄] 파일/디렉토리 작업
    https://qiita.com/supersaiakujin/items/12451cd2b8315fe7d054
    [Python 입문] 람다(람다식)의 사용법
    https://www.sejuku.net/blog/23677

    좋은 웹페이지 즐겨찾기