Python:从EXIF中提取西里尔字母字符串



我是Python的初学者,我想从实践开始学习。也就是说,我很想纠正我拥有的一大堆家庭照片中的一些EXIF信息。首先,我只想正确地从JPEG文件中获取这些信息。

他们中的一些人有一个用EXIF写的标题。它可以通过例如获得

import pyexiv2
metadata = pyexiv2.ImageMetadata(filename)
metadata.read()
title = metadata['Exif.Image.XPTitle'] 

我已经走了这么远。现在问题来了。有些标题包含西里尔字母。如果我做print title.human_value,我会得到例如

`Милой Мамуле от Майи, 11 ÑÐ½Ð²Ð°Ñ€Ñ 1944.`

而对于print title,它是

<Exif.Image.XPTitle [Byte] = 28 4 56 4 59 4 62 4 57 4 32 0 28 4 48 4 60 4 67 4 59 4 53 4 32 0 62 4 66 4 32 0 28 4 48 4 57 4 56 4 44 0 32 0 49 0 49 0 32 0 79 4 61 4 50 4 48 4 64 4 79 4 32 0 49 0 57 0 52 0 52 0 46 0 0 0>

我想看到的实际字符串是

Милой Мамуле от Майи, 11 января 1944.

这似乎是一个unicode问题,但在尝试了这里和其他地方的十几种不同方法后,我无法应对。有可能在控制台中看到俄语字母吗?我在Windows7(英语)上使用python(xy),所以我的IDE是spyder2。只是我添加了pyexiv2的默认安装。TIA!

字节为UTF-16。

在Python 3中:

>>> b = [28, 4, 56, 4, 59, 4, 62, 4, 57, 4, 32, 0, 28, 4, 48, 4, 60, 4, 67, 4, 59, 4, 53, 4, 32, 0, 62, 4, 66, 4, 32, 0, 28, 4, 48, 4, 57, 4, 56, 4, 44, 0, 32, 0, 49, 0, 49, 0, 32, 0, 79, 4, 61, 4, 50, 4, 48, 4, 64, 4, 79, 4, 32, 0, 49, 0, 57, 0, 52, 0, 52, 0, 46, 0, 0, 0]
>>> bytes(b).decode("utf-16")
'Милой Мамуле от Майи, 11 января 1944.x00'

在Python 2:中

>>> b = [28, 4, 56, 4, 59, 4, 62, 4, 57, 4, 32, 0, 28, 4, 48, 4, 60, 4, 67, 4, 59, 4, 53, 4, 32, 0, 62, 4, 66, 4, 32, 0, 28, 4, 48, 4, 57, 4, 56, 4, 44, 0, 32, 0, 49, 0, 49, 0, 32, 0, 79, 4, 61, 4, 50, 4, 48, 4, 64, 4, 79, 4, 32, 0, 49, 0, 57, 0, 52, 0, 52, 0, 46, 0, 0, 0]
>>> "".join(chr(c) for c in b).decode("utf-16")
u'u041cu0438u043bu043eu0439 u041cu0430u043cu0443u043bu0435 u043eu04
42 u041cu0430u0439u0438, 11 u044fu043du0432u0430u0440u044f 1944.x00'

我认为title.human_value数据是UTF-8格式的,已经从原始的UTF-16字节的title中解码出来。

在python shell中,在OSX:上的终端窗口中运行

>>> # this should be the same as your title.human_value:
>>> print ''.join( chr(x) for x in [208, 156, 208, 184, 208, 
              187, 208, 190, 208, 185, 32, 208, 156, 208, 
              176, 208, 188, 209, 131, 208, 187, 208, 181, 
              32, 208, 190, 209, 130, 32, 208, 156, 208, 
              176, 208, 185, 208, 184, 44, 32, 49, 49, 32, 
              209, 143, 208, 189, 208, 178, 208, 176, 209, 
              128, 209, 143, 32, 49, 57, 52, 52, 46])
Милой Мамуле от Майи, 11 января 1944.

您的控制台可能不支持西里尔字母。您可以尝试将命令提示符中的字体设置为"Lucida Console"——与cmd默认使用的历史位图字体相比,更现代的矢量字体更有可能正确支持它。

最新更新