`
wx1568444409
  • 浏览: 14602 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

用脚本将本地照片库批量导入到Day One中

 
阅读更多

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤其是去年今日,平常用来记记东西比较方便,目前支持语音,暂时还不支持视频,上次发了封建议邮件,答复目前正在测试阶段,下一个大版本就支持,另一个不足的是不支持模板,比较背景,彩色字体,开发者答复目前没有这个计划。

工具

  1. python+Anaconda+PyCharm(也是学习python一个练手机会)
  2. magick (图片处理,不丢失exif信息)
  3. exiftool (提取照片exif信息,插入到Dayone中,尤其是地理位置与创建时间)
  4. pandas (解析csv)
  5. shutil (文件复制)

流程如下:

效果如下

导入DayOne中,时间比较长,因为没有使用多线程(不会)

问题

  1. 取到的GPS 坐标是度分秒转换成x.xxx后,位置有一定的偏移,可能是地图导致
  2. 部分照片没有exif信息,只有先按上海的坐标和今天的创建时间导入后,到时候手动修改
  3. 苹果的heic格式的照片在转换时,失败,查了下magick是支持读取,但是报错,暂时没有处理

与Alfred 结合

  1. magick在转换单张照片时速度比较快,到时候写个脚本配合Alfred 做一个照片处理,很多时候在写文档时都需要贴图,在Mac上截图的图片通常比较大,目前用imageOptim,单张图片处理时间比较长。

代码

# -*- coding: utf-8 -*-

import os
import shutil
import pandas as pd



#分离文件
def separateImgByType(path, targetPath, type=[".mp4", ".mov"]):

    if not os.path.exists(targetPath):
        os.makedirs(targetPath)

    for obj in os.listdir(path):

        if obj == '.DS_Store': continue

        suffix = os.path.splitext(os.path.join(sourcePath, obj))[1].lower()

        if suffix in type:
            shutil.move(os.path.join(path, obj), os.path.join(targetPath, obj))


#删除文件名空格
def delfileNameSpace(path):
    for obj in os.listdir(path):
        if " " in obj:
            os.rename(os.path.join(path, obj), os.path.join(path, obj.replace(" ", "~")))



def convertImg(path, targetPath, size, rate=60):

    if not os.path.exists(targetPath):
        os.makedirs(targetPath)

    rateStr = str(rate) +"%";

    for obj in os.listdir(path):

        if obj == '.DS_Store': continue

        objSize = os.path.getsize(os.path.join(path, obj))

        if objSize <= size:
            shutil.copyfile(os.path.join(path, obj), os.path.join(targetPath, obj))
            continue;


        srcfrom = os.path.join(path, obj)

        srcto = os.path.join(targetPath, obj)

        cmd = "magick convert -resize %s %s %s" % (rateStr, srcfrom, srcto)

        print(cmd)

        os.system(cmd)

def createExifInfo(path):
    csvpath = os.path.join(path, "exifInfo.csv")
    cmd = "exiftool -f -r -p '$filename,$CreateDate,$GPSLatitude,$GPSLongitude,$ImageSize,$LensModel' %s > %s" % (path, csvpath)
    os.system(cmd)


def getExifInfo(path):

    list_data = pd.read_csv(path).to_records()

    return list_data

def convertGeo(geo,type):
    GPSLatitudList = str(geo).split("'")
    d = 0
    m = 0
    s = 0
    d = int(GPSLatitudList[0] if GPSLatitudList[0] != 0 else 0)
    if len(GPSLatitudList) == 2:
        m = int(GPSLatitudList[1] if GPSLatitudList[1] != 0 else 0)
    if len(GPSLatitudList) == 3:
        d = int(GPSLatitudList[2] if GPSLatitudList[2] != 0 else 0)

    dmd = d + m / 60.0 + d / 3600.0

    if dmd == 0.0 and type == 'Latitud': #121.549927,31.277549
        return 31.277549
    elif dmd == 0.0 and type == 'Logitud':
        return 121.549927
    else:
        return dmd


if __name__ == '__main__':

    size = 1.5 * 1024 * 1024

    sourcePath = "/Users/[xxxx]/Desktop/photo/"

    compactPath = "/Users/[xxxx]/Desktop/compactTarget"

    videoPath = "/Users/[xxxx]/Desktop/video/"

    HEICPath = "/Users/[xxxx]/Desktop/heic/"

    #separateImgByType(sourcePath, videoPath);

    #separateImgByType(sourcePath, HEICPath, (".HEIC"));

    #delfileNameSpace(sourcePath)

    #convertImg(sourcePath, compactPath, size)

    #createExifInfo(compactPath)

    listdata = getExifInfo(os.path.join(compactPath, "exifInfo.csv"))

    for obj in listdata:
        cmd = "dayone2 new '[%s]' '[%s]' -p '/Users/Spring/Desktop/photo1/%s' -d '%s' -j Import -coordinate %f %f"
        filename = obj[1]
        CreateDate = str(obj[2]) if str(obj[2]) != 'nan' else '2019-07-20 09:00:00'
        GPSLatitud = str(obj[3]) if str(obj[3]) != 'nan' else 0 #纬度
        GPSLogitud = str(obj[4]) if str(obj[4]) != 'nan' else 0 #经度
        ImageSize = obj[5]
        LensModel = obj[6]

        #print(CreateDate)

        title = '%s %s' % (filename, CreateDate)

        #print(GPSLatitud,"===",GPSLogitud)

        lt = convertGeo(GPSLatitud, "Latitud")

        lg = convertGeo(GPSLogitud, "Logitud")

        content = '%s ---- %s' % (ImageSize, LensModel)

        CreateDateList = str(CreateDate).split(" ")
        CreateDateList[0] = CreateDateList[0].replace(":","-");
        CreateDate = CreateDateList[0]+" "+CreateDateList[1]

        cmd = cmd % (title,content,filename,str(CreateDate),lt, lg)

        print(cmd)

        os.system(cmd)

转载于:https://my.oschina.net/SpringZhang/blog/3076832

分享到:
评论

相关推荐

    批量导入excel文件数据到SQLSERVER库脚本

    sql脚本为批量导入excel文件数据到SQLSERVER库,可以导入多个sheet,需安装MicroSoft的AccessDatabaseEngine_X64组件,网上下载即可

    3dsmax批量导入脚本

    3dsmax批量导入脚本

    照片批量导入导出

    在IT行业中,照片批量导入导出是一项常见的任务,特别是在数据管理、媒体库建设或网站维护等领域。本场景涉及的关键技术主要是数据库操作、图像处理以及批处理能力。以下将详细阐述这些知识点: 1. **Oracle数据库*...

    批量导入maven本地jar包

    批量导入maven本地jar包

    【nexus二进制库Jar包批量上传脚本工具】

    标题中的“nexus二进制库Jar包批量上传脚本工具”是指用于自动化上传Java的JAR文件到Nexus仓库的脚本程序。Nexus是一个流行的仓库管理器,广泛应用于软件开发环境中,尤其是Java生态系统,它能管理和分发各种类型的...

    oracle数据库imp批量导入多个DMP文件中的bat脚本

    imp方式批量导入dmp文件。oracle数据库bat脚本。需要配置数据库的链接信息和dmp路径信息。

    zabbix批量导入,Zabbix所有版本通用,多文件夹批量导入

    本文将详细讲解如何利用Zabbix进行批量导入,并结合提供的文件资源,帮助系统运维工程师提升自动化运维的效率。 标题中的"zabbix批量导入"是指在Zabbix中对大量配置项或模板进行一次性导入的操作,这对于拥有众多...

    实现将excel中的数据批量导入到access

    ### 实现将Excel中的数据批量导入到Access 在IT领域,数据迁移是一项常见的任务,特别是在不同格式或平台间的数据转换过程中。本篇文章将基于提供的代码示例,详细讲解如何实现将Excel中的数据批量导入到Access...

    批量导入导出FBXforUE.rar

    批量导入脚本允许用户一次性将多个FBX文件导入到UE4项目中,而不是手动逐个导入。这极大地节省了时间,并且减少了重复的工作。该脚本可能包含自动化步骤,如设置导入参数、应用缩放比例以适应UE4的单位系统,以及...

    excel批量导入数据库

    为了节省时间和降低技术门槛,可以使用一些现成的工具来实现Excel到数据库的批量导入: 1. Microsoft SQL Server Integration Services (SSIS):这是一款强大的ETL(Extract, Transform, Load)工具,可以直接处理...

    批量导入OBJ.mse

    可以使得3dmax批量导入obj实现批量化,很好,好小巧的3dmax插件。

    max批量导入3ds

    可用于批量导入3ds的插件,适合于任意版本max。可修改脚本为批量导入obj等文件

    将省市数据批量导入数据库

    "将省市数据批量导入数据库"这个主题涉及到的数据处理、数据库操作以及可能的自动化工具使用。下面将详细阐述这个过程中的关键知识点。 首先,我们需要理解数据源。在这个场景中,数据很可能是关于中国各个省份和...

    maven私库nexus批量上传jar工具

    go语言写的一个工具,用于批量上传本地仓库的jar到nexus私库。目前只有exe没有生成linux脚本。文件夹中有使用说明。 .\mvnDeployTool.exe -r C:\\Users\\yyc\\.m2\\repository\\org\\apache\\maven -s D:\devEnv\...

    U8 BOM快速导入脚本

    【U8 BOM快速导入脚本】是一种高效的方法,用于将物料清单(Bill of Materials,简称BOM)数据批量导入到用友U8系统中。用友U8是一款广泛应用于企业管理中的ERP(Enterprise Resource Planning)软件,而BOM是产品...

    max 批量导入导出obj插件

    用于在3dmax中批量导入导出obj模型,方便快捷,加快工作效率,不需要重复性一个个导入了,省去过多的工作步骤

    excle批量导入导出

    - **VBA脚本**:VBA是一种强大的编程语言,可以编写自动化脚本来批量处理Excel任务,包括导入和导出数据。 - **宏录制**:对于简单的导入导出操作,可以先通过宏录制创建基础脚本,然后根据需要进行调整和优化。 ...

    neo4j批量数据导入

    本文将深入探讨如何在Neo4j中进行批量数据导入,主要基于提供的源代码进行分析。 首先,批量数据导入涉及到的主要概念是Cypher语句,这是Neo4j用于操作数据的SQL-like语言。批量导入时,可以编写Cypher脚本一次性...

Global site tag (gtag.js) - Google Analytics