因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤其是去年今日,平常用来记记东西比较方便,目前支持语音,暂时还不支持视频,上次发了封建议邮件,答复目前正在测试阶段,下一个大版本就支持,另一个不足的是不支持模板,比较背景,彩色字体,开发者答复目前没有这个计划。
工具
- python+Anaconda+PyCharm(也是学习python一个练手机会)
- magick (图片处理,不丢失exif信息)
- exiftool (提取照片exif信息,插入到Dayone中,尤其是地理位置与创建时间)
- pandas (解析csv)
- shutil (文件复制)
流程如下:
效果如下
导入DayOne中,时间比较长,因为没有使用多线程(不会)
问题
- 取到的GPS 坐标是度分秒转换成x.xxx后,位置有一定的偏移,可能是地图导致
- 部分照片没有exif信息,只有先按上海的坐标和今天的创建时间导入后,到时候手动修改
- 苹果的heic格式的照片在转换时,失败,查了下magick是支持读取,但是报错,暂时没有处理
与Alfred 结合
- 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)
相关推荐
sql脚本为批量导入excel文件数据到SQLSERVER库,可以导入多个sheet,需安装MicroSoft的AccessDatabaseEngine_X64组件,网上下载即可
3dsmax批量导入脚本
在IT行业中,照片批量导入导出是一项常见的任务,特别是在数据管理、媒体库建设或网站维护等领域。本场景涉及的关键技术主要是数据库操作、图像处理以及批处理能力。以下将详细阐述这些知识点: 1. **Oracle数据库*...
批量导入maven本地jar包
标题中的“nexus二进制库Jar包批量上传脚本工具”是指用于自动化上传Java的JAR文件到Nexus仓库的脚本程序。Nexus是一个流行的仓库管理器,广泛应用于软件开发环境中,尤其是Java生态系统,它能管理和分发各种类型的...
imp方式批量导入dmp文件。oracle数据库bat脚本。需要配置数据库的链接信息和dmp路径信息。
本文将详细讲解如何利用Zabbix进行批量导入,并结合提供的文件资源,帮助系统运维工程师提升自动化运维的效率。 标题中的"zabbix批量导入"是指在Zabbix中对大量配置项或模板进行一次性导入的操作,这对于拥有众多...
### 实现将Excel中的数据批量导入到Access 在IT领域,数据迁移是一项常见的任务,特别是在不同格式或平台间的数据转换过程中。本篇文章将基于提供的代码示例,详细讲解如何实现将Excel中的数据批量导入到Access...
批量导入脚本允许用户一次性将多个FBX文件导入到UE4项目中,而不是手动逐个导入。这极大地节省了时间,并且减少了重复的工作。该脚本可能包含自动化步骤,如设置导入参数、应用缩放比例以适应UE4的单位系统,以及...
为了节省时间和降低技术门槛,可以使用一些现成的工具来实现Excel到数据库的批量导入: 1. Microsoft SQL Server Integration Services (SSIS):这是一款强大的ETL(Extract, Transform, Load)工具,可以直接处理...
可以使得3dmax批量导入obj实现批量化,很好,好小巧的3dmax插件。
可用于批量导入3ds的插件,适合于任意版本max。可修改脚本为批量导入obj等文件
"将省市数据批量导入数据库"这个主题涉及到的数据处理、数据库操作以及可能的自动化工具使用。下面将详细阐述这个过程中的关键知识点。 首先,我们需要理解数据源。在这个场景中,数据很可能是关于中国各个省份和...
go语言写的一个工具,用于批量上传本地仓库的jar到nexus私库。目前只有exe没有生成linux脚本。文件夹中有使用说明。 .\mvnDeployTool.exe -r C:\\Users\\yyc\\.m2\\repository\\org\\apache\\maven -s D:\devEnv\...
【U8 BOM快速导入脚本】是一种高效的方法,用于将物料清单(Bill of Materials,简称BOM)数据批量导入到用友U8系统中。用友U8是一款广泛应用于企业管理中的ERP(Enterprise Resource Planning)软件,而BOM是产品...
用于在3dmax中批量导入导出obj模型,方便快捷,加快工作效率,不需要重复性一个个导入了,省去过多的工作步骤
- **VBA脚本**:VBA是一种强大的编程语言,可以编写自动化脚本来批量处理Excel任务,包括导入和导出数据。 - **宏录制**:对于简单的导入导出操作,可以先通过宏录制创建基础脚本,然后根据需要进行调整和优化。 ...
本文将深入探讨如何在Neo4j中进行批量数据导入,主要基于提供的源代码进行分析。 首先,批量数据导入涉及到的主要概念是Cypher语句,这是Neo4j用于操作数据的SQL-like语言。批量导入时,可以编写Cypher脚本一次性...