如何使用Python将日期时间属性添加到我的JPG文件中,以便在Google照片中进行正确的索引?

如何使用Python将日期时间属性添加到我的JPG文件中,以便在Google照片中进行正确的索引?,python,python-2.7,jpeg,exif,google-photos,Python,Python 2.7,Jpeg,Exif,Google Photos,我正在使用照相工具包,它可以生成日期时间保存为文件名的图像(例如“2019-10-24-10-06-56.jpg”),而不是保存在元数据中。我正试图编写一个Python脚本,使我能够从文件名中提取日期时间,并将每个文件的日期时间元数据属性添加到其中。这样我就可以上传到谷歌照片,以便按时间顺序编制正确的索引 据我所知,谷歌照片使用“创建”日期时间属性,所以我相信这是我需要为每个JPG文件更改的内容。最好的方法是什么?我尝试了一些事情,包括更改EXIF数据(成功地使用了piexif),但这似乎并没有

我正在使用照相工具包,它可以生成日期时间保存为文件名的图像(例如“2019-10-24-10-06-56.jpg”),而不是保存在元数据中。我正试图编写一个Python脚本,使我能够从文件名中提取日期时间,并将每个文件的日期时间元数据属性添加到其中。这样我就可以上传到谷歌照片,以便按时间顺序编制正确的索引

据我所知,谷歌照片使用“创建”日期时间属性,所以我相信这是我需要为每个JPG文件更改的内容。最好的方法是什么?我尝试了一些事情,包括更改EXIF数据(成功地使用了piexif),但这似乎并没有改变Windows中显示的图像属性,而且它仍然无法在Google照片中正确索引

如果可能的话,我很想在Python中这样做(我使用的是Python 2.7)——已经编写了从文件名中提取日期时间的代码

以下代码显示为成功更改EXIF数据:

from datetime import datetime
import piexif
import os

jpgFolder = r"C:\Users\srgan\Desktop\Naturewatch Camera Photos\NaturewatchCameraPhotos_24Oct19"

## count number of photos found
listOfFiles = os.listdir(jpgFolder)
fileCount = len(listOfFiles)

## create datetimeString from JPG filename
for jpg in os.listdir(jpgFolder):
    filepath = jpgFolder + "\\" + jpg
    year = jpg[0:4]
    month = jpg[5:7]
    day = jpg[8:10]
    hour = jpg[11:13]
    mins = jpg[14:16]
    datetimeStringNew = day + "/" + month + "/" + year + " " + hour + ":" + mins

## change exif datetimestamp for "Date Taken"
    exif_dict = piexif.load(filepath)
    exif_dict['Exif'] = { piexif.ExifIFD.DateTimeOriginal: datetime(2019, 10, 25, 1, 1).strftime("%d:%m:%Y %H:%M") }
    exif_bytes = piexif.dump(exif_dict)
    piexif.insert(exif_bytes, filepath)
正确返回以下内容:

{'Exif': {36867: '25:10:2019 01:01'}, '0th': {34665: 26}, 'Interop': {}, '1st': {}, 'thumbnail': None, 'GPS': {}}
但这并没有反映在上传到谷歌照片的日期上

谢谢

快乐的地理学家
(不是一个有经验的程序员,所以对任何愚蠢的问题表示歉意)

首先感谢您的发帖-我有类似的问题,您的代码给了我一些很好的提示

我的问题发生在上传后,因为Exif中没有GMT/UTC标记,所以对于谷歌照片,当没有GPS数据时,它会上传数据,并假设上传位置与拍摄照片的时区(例如GMT+11)匹配。您可以通过选择最近的上传,“编辑日期和时间”选择新位置并重新调整时间,将VPN连接到该位置,或者在上传后更改所有照片

其次,我发现更新DateTimeOriginal和DateTimeDigitalized似乎都有帮助

第三,我认为Exif数据的日期格式是yyyy:mm:dd hh:mm:ss,因此我也在下面对其进行了更新

此外,我还使用了datetime字符串解析器将现有的filedate转换为python日期

下面是我对您的代码的看法,这可能会对您有所帮助(并保留其余的Exif数据!)


首先感谢你的发帖-我有类似的问题,你的代码给了我一些好的提示

我的问题发生在上传后,因为Exif中没有GMT/UTC标记,所以对于谷歌照片,当没有GPS数据时,它会上传数据,并假设上传位置与拍摄照片的时区(例如GMT+11)匹配。您可以通过选择最近的上传,“编辑日期和时间”选择新位置并重新调整时间,将VPN连接到该位置,或者在上传后更改所有照片

其次,我发现更新DateTimeOriginal和DateTimeDigitalized似乎都有帮助

第三,我认为Exif数据的日期格式是yyyy:mm:dd hh:mm:ss,因此我也在下面对其进行了更新

此外,我还使用了datetime字符串解析器将现有的filedate转换为python日期

下面是我对您的代码的看法,这可能会对您有所帮助(并保留其余的Exif数据!)


你还得用pexif。研究谷歌照片实际使用的信息(看起来是和修改该字段。一旦您确定了要更改的属性,但仍然无法使其正常工作,请用您的代码发布一个问题,以及与您期望的相比会发生什么情况,我们可能会从那里得到帮助。好的,很好,我们会尽快完成,谢谢Martijn问题更新了我尝试的代码。我查看了“标记为重复”的其他问题,我相信这会做和我尝试过的相同的事情?你仍然需要使用pexif。研究谷歌照片实际使用的信息(看起来是和修改该字段。一旦您确定了要更改的属性,但仍然无法使其正常工作,请用您的代码发布一个问题,以及与您期望的相比会发生什么情况,我们可能会从那里得到帮助。好的,很好,我们会尽快完成,谢谢Martijn问题更新了我尝试的代码。我查看了“标记为重复”的其他问题,我相信这会做我尝试过的相同的事情?
from datetime import datetime
import piexif
import os

jpgFolder = r"C:\Users\srgan\Desktop\Naturewatch Camera Photos\NaturewatchCameraPhotos_24Oct19"

## count number of photos found
listOfFiles = os.listdir(jpgFolder)
fileCount = len(listOfFiles)

## create datetimeString from JPG filename
for jpg in os.listdir(jpgFolder):
    filepath = jpgFolder + "\\" + jpg

    parsedate=datetime.strptime(jpg[0:16], "%Y-%m-%d-%H-%M-%S")
## change exif datetimestamp for "Date Taken"
    exif_dict = piexif.load(filepath)
    newExifDate=parsedate.strftime("%Y:%m:%d %H:%M:%S")
    exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal]=newExifDate
    exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized]=newExifDate
    exif_bytes = piexif.dump(exif_dict)
    piexif.insert(exif_bytes, filepath)