{"id":3683,"date":"2018-03-04T13:40:39","date_gmt":"2018-03-04T04:40:39","guid":{"rendered":"https:\/\/www.ws-meguro.com\/\/?p=3683"},"modified":"2018-03-04T13:45:07","modified_gmt":"2018-03-04T04:45:07","slug":"python%e3%81%a7%e5%88%9d%e3%82%a2%e3%83%97%e3%83%aa%ef%bc%88jpg%e3%83%90%e3%83%83%e3%82%af%e3%82%a2%e3%83%83%e3%83%97%ef%bc%8b%e7%b8%ae%e5%b0%8f%e5%8c%96%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.wsmeguro.jp\/wp\/?p=3683","title":{"rendered":"Python\u3067\u521d\u30a2\u30d7\u30ea\uff08JPG\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\uff0b\u7e2e\u5c0f\u5316\uff09"},"content":{"rendered":"<p>Windows\u306ePC\u306eData\u7528HDD\u304c\uff13TB\u306b\u306a\u3063\u305f\u6642\u3001\u904e\u53bb\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u6574\u7406\u3057\u306a\u3044\u3067\u3069\u304b\u3063\u3068\u79fb\u3057\u305f\u7d50\u679c\u3001\u3044\u308d\u3093\u306a\u30d5\u30a9\u30eb\u30c0\u306b\u3044\u308d\u3093\u306a\u30d5\u30a1\u30a4\u30eb\u304c\u6563\u5728\u3059\u308b\u7d50\u679c\u306b\u306a\u3063\u3066\u3057\u307e\u3063\u305f\u3002\u7279\u306b\u3001\u753b\u50cf\u306f\uff11\u3064\u306b\u307e\u3068\u3081\u3066\u3001Mac\u3067\u3082\u5171\u6709\u3057\u305f\u3044\u3002\u3067\u3082\u3001Mac\u306f\uff12\uff15\uff16gb\u306a\u306e\u3067\u3001\u7e2e\u5c0f\u3057\u306a\u3044\u3068\u306f\u3044\u3089\u306a\u3044\u3068\u8a00\u3046\u3053\u3068\u3067\u3001\u81ea\u5206\u3067\u4f5c\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u305f\u3002<br \/>\nJAVA\u306b\u3057\u3088\u3046\u304bPython\u306b\u3057\u3088\u3046\u304b\u30fb\u30fb\u30fb\u4eca\u304b\u3089\u53d6\u308a\u7d44\u3080\u306a\u3089Python\u3060\u308d\u3046\u3068\u8a00\u3046\u3053\u3068\u3067\u3001Python\uff08Eclipse\u306ePyDEV\uff09\u3068wxGlade\u3067\u4f5c\u3063\u3066\u307f\u307e\u3057\u305f\u3002wxGlade\u306fPython\u5f62\u5f0f\u3067\u4fdd\u5b58\u3059\u308b\u30bf\u30a4\u30d7\u3092\u9078\u629e\u3057\u307e\u3057\u305f\u3002\uff08\u30e1\u30ea\u30c3\u30c8\u3001\u305d\u306e\u307e\u307e\u7d9a\u3051\u3066\u30b3\u30fc\u30c9\u3092\u66f8\u3051\u308b\u3002\u30c7\u30e1\u30ea\u30c3\u30c8\u3001Generate\u3059\u308b\u5ea6\u306b\u3001\u81ea\u52d5\u751f\u6210\u90e8\u5206\u3092wxGlade\u304c\u4e0a\u66f8\u304d\u3057\u3066\u304f\u308c\u308b\u306e\u3067\u3001\u30b3\u30fc\u30c9\u4e0a\u3067\u306e\u4fee\u6b63\u306f\u30af\u30ea\u30a2\u3055\u308c\u308b\u306e\u3067\u3001\u6975\u529bGUI\u4e0a\u3067\u8a2d\u5b9a\u3057\u306a\u3044\u3068\u306a\u3089\u306a\u3044\uff09<\/p>\n<p>\u3067\u304d\u305f\u306e\u304c\u3001\u3053\u308c\u3002\u4f59\u8a08\u306a\u30dc\u30bf\u30f3\uff08Make Small Pict\uff09\u304c\u3042\u308b\u3051\u3069\u3001\u524d\u8ff0\u306e\u7406\u7531\u3067\u6d88\u305b\u306a\u3044\u3002Search\u30dc\u30bf\u30f3\u3067\u5168\u90e8\u52d5\u304b\u3057\u3066\u3057\u307e\u3063\u305f\u3002<br \/>\n\u897f\u66a6\u306e\u5e74\u6bce\u306b\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u3063\u3066\u3001\u305d\u306e\u4e0b\u306b\u65e5\u4ed8\u5225\u306e\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u3063\u3066\u3001\u8a72\u5f53\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u304d\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u540d\u304c\u540c\u3058\u5834\u5408\u306f\u3001\u65e5\u4ed8\u3051\u304c\u7570\u306a\u308c\u3070\u3001\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u5909\u3048\u3066\u4fdd\u5b58\u3057\u3001\u540c\u3058\u5834\u5408\u306f\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u304c\u5927\u304d\u3044\u65b9\u3092\u6b8b\u3059\u69d8\u306b\u3057\u3066\u3044\u307e\u3059\u3002\u305d\u308c\u306b\u5408\u308f\u305b\u3066\u3001\u5c0f\u3055\u3044\u30d5\u30a1\u30a4\u30eb\uff08\u9577\u8fba\u3092\uff11\uff16\uff10\uff10\u306b\u56fa\u5b9a\uff09\u3092\u4f5c\u308a\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/www.wsmeguro.jp\/\/wp\/wp-content\/uploads\/2018\/03\/7c2e7cdb5d7d58e2bb86cb7060fb2eae.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.wsmeguro.jp\/\/wp\/wp-content\/uploads\/2018\/03\/7c2e7cdb5d7d58e2bb86cb7060fb2eae.png\" alt=\"\" width=\"644\" height=\"481\" class=\"aligncenter size-full wp-image-3685\" srcset=\"https:\/\/www.wsmeguro.jp\/wp\/wp-content\/uploads\/2018\/03\/7c2e7cdb5d7d58e2bb86cb7060fb2eae.png 644w, https:\/\/www.wsmeguro.jp\/wp\/wp-content\/uploads\/2018\/03\/7c2e7cdb5d7d58e2bb86cb7060fb2eae-300x224.png 300w\" sizes=\"auto, (max-width: 644px) 100vw, 644px\" \/><\/a><!--more--><br \/>\n\u30b3\u30fc\u30c9\u306f\u3001\u3053\u3061\u3089\u3002\u6c5a\u3044\u3057\u3001\u30ba\u30eb\u30ba\u30eb\u3068\u7e4b\u304c\u3063\u3066\u3044\u3066\u898b\u8f9b\u3044\u3067\u3059\u304c\u3001\u9006\u306b\u4e00\u89a7\u6027\u304c\u3042\u308a\u3001\u3042\u3068\u3067\u632f\u308a\u8fd4\u308b\u6642\u306b\u4fbf\u5229\u306a\u306e\u3067\u3001\u3053\u306e\u307e\u307e\u306b\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"lang:python decode:true \" title=\"My first Python\" >#!\/usr\/bin\/env python\r\n# -*- coding: UTF-8 -*-\r\n#\r\n# generated by wxGlade 0.8.0b3 on Sat Mar  3 13:40:06 2018\r\n#\r\nimport os\r\nimport shutil\r\nimport wx\r\nimport time\r\nfrom datetime import datetime\r\nimport json\r\nfrom PIL import Image\r\nfrom PIL.ExifTags import TAGS\r\n\r\n# begin wxGlade: dependencies\r\n# end wxGlade\r\n\r\n# begin wxGlade: extracode\r\n\r\n# end wxGlade\r\n\r\nclass MyFrame(wx.Frame):\r\n    def __init__(self, *args, **kwds):\r\n        # begin wxGlade: MyFrame.__init__\r\n        kwds[\"style\"] = kwds.get(\"style\", 0) | wx.DEFAULT_FRAME_STYLE\r\n        wx.Frame.__init__(self, *args, **kwds)\r\n        self.SetSize((640, 480))\r\n        self.buttonTopFolder = wx.Button(self, wx.ID_ANY, \"Set Top Folder\")\r\n        self.labelTopFolder = wx.StaticText(self, wx.ID_ANY, self.readJson(\"Top\"))\r\n        self.buttonTargetFolder = wx.Button(self, wx.ID_ANY, \"Set Target Folder\")\r\n        self.labelTargetFolder = wx.StaticText(self, wx.ID_ANY, self.readJson(\"Target\"))\r\n        self.buttonSearch = wx.Button(self, wx.ID_ANY, \"Search\")\r\n        self.labelNumOfJPG = wx.StaticText(self, wx.ID_ANY, \"0\\t\", style=wx.ALIGN_CENTER)\r\n        self.labelNumOfFiles = wx.StaticText(self, wx.ID_ANY, \"0\", style=wx.ALIGN_CENTER)\r\n        self.buttonSetSmallFolder = wx.Button(self, wx.ID_ANY, \"Set a Folder for Small Pict\")\r\n        self.labelSmallFolder = wx.StaticText(self, wx.ID_ANY, self.readJson(\"Small\"), style=wx.ALIGN_CENTER | wx.ALIGN_RIGHT)\r\n        self.buttonMakeSmall = wx.Button(self, wx.ID_ANY, \"Make Small Pict\")\r\n        self.gaugeProgress = wx.Gauge(self, wx.ID_ANY, 10)\r\n        self.listFiles = wx.ListCtrl(self, wx.ID_ANY, style=wx.LC_HRULES | wx.LC_REPORT | wx.LC_VRULES)\r\n\r\n        self.__set_properties()\r\n        self.__do_layout()\r\n\r\n        self.Bind(wx.EVT_BUTTON, self.onClick_buttonTopFolder, self.buttonTopFolder)\r\n        self.Bind(wx.EVT_BUTTON, self.onClick_buttonTargetFolder, self.buttonTargetFolder)\r\n        self.Bind(wx.EVT_BUTTON, self.onClick_buttonSearch, self.buttonSearch)\r\n        self.Bind(wx.EVT_BUTTON, self.onClick_buttonSetSmallFolder, self.buttonSetSmallFolder)\r\n        self.Bind(wx.EVT_BUTTON, self.onClick_buttonMakeSmall, self.buttonMakeSmall)\r\n\r\n        #self.importJson()\r\n        # end wxGlade\r\n\r\n    def __set_properties(self):\r\n        # begin wxGlade: MyFrame.__set_properties\r\n        self.SetTitle(\"frame\")\r\n        self.buttonTopFolder.SetMinSize((160, 20))\r\n        self.labelTopFolder.SetMinSize((480, 20))\r\n        self.labelTopFolder.SetBackgroundColour(wx.Colour(194, 240, 220))\r\n        self.buttonTargetFolder.SetMinSize((160, 20))\r\n        self.labelTargetFolder.SetMinSize((480, 20))\r\n        self.labelTargetFolder.SetBackgroundColour(wx.Colour(238, 196, 249))\r\n        self.buttonSearch.SetMinSize((160, 20))\r\n        self.labelNumOfJPG.SetMinSize((120, 20))\r\n        self.labelNumOfJPG.SetBackgroundColour(wx.Colour(186, 235, 243))\r\n        self.labelNumOfFiles.SetMinSize((120, 20))\r\n        self.labelNumOfFiles.SetBackgroundColour(wx.Colour(253, 253, 151))\r\n        self.buttonSetSmallFolder.SetMinSize((160, 20))\r\n        self.labelSmallFolder.SetMinSize((160, 20))\r\n        self.labelSmallFolder.SetBackgroundColour(wx.Colour(185, 255, 188))\r\n        self.buttonMakeSmall.SetMinSize((160, 20))\r\n        self.gaugeProgress.SetMinSize((160, 20))\r\n        self.listFiles.SetMinSize((640, 420))\r\n        self.listFiles.AppendColumn(\"path\", format=wx.LIST_FORMAT_LEFT, width=320)\r\n        self.listFiles.AppendColumn(\"DateTime\", format=wx.LIST_FORMAT_LEFT, width=160)\r\n        self.listFiles.AppendColumn(\"FileSize(KB)\", format=wx.LIST_FORMAT_LEFT, width=120)\r\n        self.listFiles.AppendColumn(\"Target Folder\", format=wx.LIST_FORMAT_LEFT, width=240)\r\n        # end wxGlade\r\n\r\n    def __do_layout(self):\r\n        # begin wxGlade: MyFrame.__do_layout\r\n        sizer_1 = wx.BoxSizer(wx.VERTICAL)\r\n        sizer_2 = wx.BoxSizer(wx.VERTICAL)\r\n        sizer_9 = wx.BoxSizer(wx.HORIZONTAL)\r\n        sizer_5 = wx.BoxSizer(wx.HORIZONTAL)\r\n        sizer_6 = wx.BoxSizer(wx.HORIZONTAL)\r\n        sizer_8 = wx.BoxSizer(wx.HORIZONTAL)\r\n        sizer_7 = wx.BoxSizer(wx.HORIZONTAL)\r\n        sizer_4 = wx.BoxSizer(wx.HORIZONTAL)\r\n        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)\r\n        sizer_3.Add(self.buttonTopFolder, 0, wx.ALIGN_CENTER, 0)\r\n        sizer_3.Add(self.labelTopFolder, 0, wx.ALIGN_CENTER | wx.ALL, 2)\r\n        sizer_2.Add(sizer_3, 1, wx.EXPAND, 0)\r\n        sizer_4.Add(self.buttonTargetFolder, 0, wx.ALIGN_CENTER, 0)\r\n        sizer_4.Add(self.labelTargetFolder, 0, wx.ALIGN_CENTER | wx.ALL, 2)\r\n        sizer_2.Add(sizer_4, 1, wx.EXPAND, 0)\r\n        sizer_5.Add(self.buttonSearch, 0, wx.ALIGN_CENTER, 0)\r\n        labelTitle1 = wx.StaticText(self, wx.ID_ANY, \"Num of Jpeg\", style=wx.ALIGN_CENTER)\r\n        labelTitle1.SetMinSize((120, 20))\r\n        labelTitle1.SetBackgroundColour(wx.Colour(186, 235, 243))\r\n        sizer_7.Add(labelTitle1, 0, wx.ALIGN_CENTER, 0)\r\n        sizer_7.Add(self.labelNumOfJPG, 0, wx.ALIGN_CENTER | wx.ALL, 1)\r\n        sizer_6.Add(sizer_7, 1, wx.EXPAND, 0)\r\n        labelTitle2 = wx.StaticText(self, wx.ID_ANY, \"Num of Files\", style=wx.ALIGN_CENTER)\r\n        labelTitle2.SetMinSize((120, 20))\r\n        labelTitle2.SetBackgroundColour(wx.Colour(253, 253, 151))\r\n        sizer_8.Add(labelTitle2, 0, wx.ALIGN_CENTER, 0)\r\n        sizer_8.Add(self.labelNumOfFiles, 0, wx.ALIGN_CENTER | wx.ALL, 1)\r\n        sizer_6.Add(sizer_8, 1, wx.EXPAND, 0)\r\n        sizer_5.Add(sizer_6, 1, wx.EXPAND, 0)\r\n        sizer_2.Add(sizer_5, 1, wx.EXPAND, 0)\r\n        sizer_9.Add(self.buttonSetSmallFolder, 0, wx.ALIGN_CENTER, 0)\r\n        sizer_9.Add(self.labelSmallFolder, 0, wx.ALIGN_CENTER, 0)\r\n        sizer_9.Add(self.buttonMakeSmall, 0, wx.ALIGN_CENTER, 0)\r\n        sizer_9.Add(self.gaugeProgress, 0, wx.ALIGN_CENTER | wx.EXPAND, 0)\r\n        sizer_2.Add(sizer_9, 1, wx.EXPAND, 0)\r\n        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)\r\n        sizer_1.Add(self.listFiles, 1, wx.ALL | wx.EXPAND, 0)\r\n        self.SetSizer(sizer_1)\r\n        self.Layout()\r\n        # end wxGlade\r\n\r\n    def onClick_buttonTopFolder(self, event):  # wxGlade: MyFrame.&lt;event_handler&gt;\r\n        topDir = wx.DirDialog(self, u'\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044', style=wx.DD_DEFAULT_STYLE, defaultPath=self.labelTopFolder.GetLabel())\r\n        if topDir.ShowModal() == wx.ID_OK:\r\n            self.labelTopFolder.SetLabel(topDir.GetPath())\r\n            self.writeJson()\r\n        topDir.Destroy()\r\n\r\n    def onClick_buttonTargetFolder(self, event):  # wxGlade: MyFrame.&lt;event_handler&gt;\r\n        targetDir = wx.DirDialog(None, u'\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044', style=wx.DD_DEFAULT_STYLE, defaultPath=self.labelTargetFolder.GetLabel())\r\n        if targetDir.ShowModal() == wx.ID_OK:\r\n            self.labelTargetFolder.SetLabel(targetDir.GetPath())\r\n            self.writeJson()\r\n        targetDir.Destroy()\r\n\r\n    def onClick_buttonSearch(self, event):  # wxGlade: MyFrame.&lt;event_handler&gt;\r\n        listOfFiles = list(find_all_files(self.labelTopFolder.GetLabel()))\r\n        numLists = len(listOfFiles)\r\n        self.listFiles.DeleteAllItems()\r\n        col = 0\r\n        dirTarX = \"\"\r\n        self.gaugeProgress.SetValue(0)\r\n        for dr in listOfFiles:\r\n            if (dr.endswith(\".jpg\") or dr.endswith(\".JPG\")):\r\n                self.listFiles.InsertItem(col, dr)\r\n                ex1 = getExifImageDate(dr,\"DateTimeOriginal\")\r\n                orgW, orgH = ex1[0].size\r\n                if orgW &gt; orgH:\r\n                    tarW = 1600\r\n                    tarH = int(1600 * orgH \/ orgW)\r\n                else:\r\n                    tarH = 1600\r\n                    tarW = int(1600 * orgW \/ orgH)\r\n                dttm1 = datetime.strptime(ex1[1], '%Y:%m:%d %H:%M:%S') if ex1[1] != \"NoData\" else datetime.fromtimestamp(os.path.getmtime(dr))\r\n                dt0 = os.path.getatime(dr)\r\n                self.listFiles.SetItem(col, 1, dttm1.strftime('%Y\/%m\/%d %H:%M:%S'))\r\n                flsz1 = os.path.getsize(dr)\r\n                self.listFiles.SetItem(col, 2, '{:,}'.format(int(flsz1\/1024)))\r\n                dirTar = self.labelTargetFolder.GetLabel() + getTaregtFolder(dttm1)\r\n                dirTar2 = self.labelSmallFolder.GetLabel() + getTaregtFolder(dttm1)\r\n                self.listFiles.SetItem(col, 3, dirTar)\r\n                if dirTar != dirTarX:\r\n                    if not os.path.exists(dirTar):\r\n                        os.makedirs(dirTar)\r\n                    if not os.path.exists(dirTar2):\r\n                        os.makedirs(dirTar2)\r\n                fileTar = getFolderFile(dirTar, os.path.basename(dr))\r\n                fileTar2 = getFolderFile(dirTar2, os.path.basename(dr))\r\n                if os.path.exists(fileTar):\r\n                    flsz0 = os.path.getsize(fileTar)\r\n                    dttm0 = datetime.strptime(ex1[1], '%Y:%m:%d %H:%M:%S') if ex1[1] != \"NoData\" else datetime.fromtimestamp(os.path.getmtime(dr))\r\n                    if dttm0 != dttm1:\r\n                        nameBase = os.path.basename(fileTar)\r\n                        nameBody, nameExt = os.path.splitext(nameBase)\r\n                        cnt = 0\r\n                        fileNew1 = getFolderFile(dirTar, nameBody + str(cnt) + nameExt)\r\n                        fileNew2 = getFolderFile(dirTar2, nameBody + str(cnt) + nameExt)\r\n                        while not os.path.exists(fileNew1):\r\n                            cnt += 1\r\n                            fileNew1 = getFolderFile(dirTar, nameBody + str(cnt) + nameExt)\r\n                            fileNew2 = getFolderFile(dirTar, nameBody + str(cnt) + nameExt)\r\n                        shutil.copyfile(dr, fileNew1)\r\n                        os.utime(fileNew1, (dt0, dttm1.timestamp()))\r\n                        smallPict = ex1[0].resize((tarW, tarH), Image.LANCZOS)\r\n                        smallPict.save(fileNew2)\r\n                        os.utime(fileNew2, (dt0, dttm1.timestamp()))\r\n                    elif flsz0 &gt; flsz1:\r\n                        shutil.copyfile(dr, fileTar)\r\n                        os.utime(fileTar, (dt0, dttm1.timestamp()))\r\n                        smallPict = ex1[0].resize((tarW, tarH), Image.LANCZOS)\r\n                        smallPict.save(fileTar2)\r\n                        os.utime(fileTar2, (dt0, dttm1.timestamp()))\r\n\r\n                else:\r\n                    shutil.copyfile(dr, fileTar)\r\n                    os.utime(fileTar, (dt0, dttm1.timestamp()))\r\n                    smallPict = ex1[0].resize((tarW, tarH), Image.LANCZOS)\r\n                    smallPict.save(fileTar2)\r\n                    os.utime(fileTar2, (dt0, dttm1.timestamp()))\r\n                ex1 = {}\r\n                col += 1\r\n                if col % int(numLists\/10) == 0:\r\n                    self.gaugeProgress.SetValue(int(col * 10 \/ numLists))\r\n                dirTarX = dirTar\r\n        self.labelNumOfFiles.SetLabel(str(numLists))\r\n        self.labelNumOfJPG.SetLabel(str(col))\r\n\r\n    def onClick_buttonSetSmallFolder(self, event):  # wxGlade: MyFrame.&lt;event_handler&gt;\r\n        smallDir = wx.DirDialog(None, u'\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044', style=wx.DD_DEFAULT_STYLE, defaultPath=self.labelSmallFolder.GetLabel())\r\n        if smallDir.ShowModal() == wx.ID_OK:\r\n            self.labelSmallFolder.SetLabel(smallDir.GetPath())\r\n            self.writeJson()\r\n        smallDir.Destroy()\r\n\r\n    def onClick_buttonMakeSmall(self, event):  # wxGlade: MyFrame.&lt;event_handler&gt;\r\n        print(\"Event handler 'onClick_buttonMakeSmall' not implemented!\")\r\n        event.Skip()\r\n\r\n    def readJson(self, lbl):\r\n        fileJson = 'foldersW.json' if os.name == 'nt' else 'foldersM.json'\r\n        try:\r\n            f = open(fileJson, 'r')\r\n        except FileNotFoundError:\r\n            return \"\"\r\n        data_json=json.load(f)\r\n        return data_json[lbl]\r\n\r\n    def writeJson(self):\r\n        fileJson = 'foldersW.json' if os.name == 'nt' else 'foldersM.json'\r\n        f = open(fileJson, 'w')\r\n        json_data = {'Top' : self.labelTopFolder.GetLabel(), 'Target' : self.labelTargetFolder.GetLabel(), 'Small' : self.labelSmallFolder.GetLabel()}\r\n        json.dump(json_data, f)\r\n\r\n# end of class MyFrame\r\ndef getExifDate(file):\r\n    im = Image.open(file)\r\n    try:\r\n        exif = im._getexif()\r\n        ts1 = exif.items()\r\n    except AttributeError:\r\n        return \"NoData\"\r\n    exif_table = {}\r\n    for tag_id, value in exif.items():\r\n        tag = TAGS.get(tag_id, tag_id)\r\n        exif_table[tag] = value\r\n    return exif_table.get(\"DateTimeOriginal\")\r\n\r\ndef getExifImageDate(file, tagName):\r\n    im = Image.open(file)\r\n    try:\r\n        exif = im._getexif()\r\n        ts1 = exif.items()\r\n    except AttributeError:\r\n        return (im, \"NoData\")\r\n    exif_table = {}\r\n    for tag_id, value in exif.items():\r\n        tag = TAGS.get(tag_id, tag_id)\r\n        exif_table[tag] = value\r\n    return (im, exif_table.get(tagName))\r\n\r\ndef getTaregtFolder(dttm):\r\n    strDigit = \"\\\\\" if os.name == 'nt' else \"\/\"\r\n    return strDigit + str(dttm.year) + strDigit + dttm.strftime('%Y_%m_%d')\r\n\r\ndef getFolderFile(nameFolder, nameFile):\r\n    strDigit = \"\\\\\" if os.name == 'nt' else \"\/\"\r\n    return nameFolder + strDigit + nameFile\r\n\r\ndef find_all_files(directory):\r\n    for root, dirs, files in os.walk(directory):\r\n        yield root\r\n        for file in files:\r\n            yield os.path.join(root, file)\r\n\r\nclass MyApp(wx.App):\r\n    def OnInit(self):\r\n        self.frame = MyFrame(None, wx.ID_ANY, \"\")\r\n        self.SetTopWindow(self.frame)\r\n        self.frame.Show()\r\n        return True\r\n\r\n# end of class MyApp\r\n\r\nif __name__ == \"__main__\":\r\n    app = MyApp(0)\r\n    app.MainLoop()\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Windows\u306ePC\u306eData\u7528HDD\u304c\uff13TB\u306b\u306a\u3063\u305f\u6642\u3001\u904e\u53bb\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u6574\u7406\u3057\u306a\u3044\u3067\u3069\u304b\u3063\u3068\u79fb\u3057\u305f\u7d50\u679c\u3001\u3044\u308d\u3093\u306a\u30d5\u30a9\u30eb\u30c0\u306b\u3044\u308d\u3093\u306a\u30d5\u30a1\u30a4\u30eb\u304c\u6563\u5728\u3059\u308b\u7d50\u679c\u306b\u306a\u3063\u3066\u3057\u307e\u3063\u305f\u3002\u7279\u306b\u3001\u753b\u50cf\u306f\uff11\u3064\u306b\u307e\u3068\u3081\u3066\u3001Mac\u3067\u3082\u5171\u6709\u3057&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"footnotes":""},"categories":[526,508,505],"tags":[528,532,531,533,529,527,530],"class_list":["post-3683","post","type-post","status-publish","format-standard","hentry","category-python","category-508","category-programming","tag-eclipse","tag-exif","tag-jpg","tag-listctrl","tag-pydev","tag-python","tag-wxglade"],"_links":{"self":[{"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=\/wp\/v2\/posts\/3683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3683"}],"version-history":[{"count":4,"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=\/wp\/v2\/posts\/3683\/revisions"}],"predecessor-version":[{"id":3688,"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=\/wp\/v2\/posts\/3683\/revisions\/3688"}],"wp:attachment":[{"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsmeguro.jp\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}