2013-10-02 4 views
0

Я пытаюсь прочитать данные IPTC, используя python и pyexiv2.Как правильно декодировать испорченную строку UTF-8?

import pyexiv2 
image = pyexiv2.Image('test.jpg') 
image.readMetadata() 
print image['Iptc.Application2.Caption'] 

Это дает мне thefollwing:

Copyright: Michael Huebner, Kontakt: +4915100000000xxxxxx Höxx (30) ist im Streit mit dem Arbeitsamt in Brandenburg, xxxxxxxxxxxxxx , xxxxxx, 

Но он должен дать мне:

Kinder: Axxxxx Hxxxxx (10) und Exxxxxx Höxx (5), Rxxxxxxx Höxx (30) ist im Streit mit dem Arbeitsamt in Brandenburg, xxxxxxxxxxxxx , xxxxxxxxxxx, 
Copyright: Michael Huebner, Kontakt: +4915100000000 

Это немного грязный, потому что я должен был удалить личные данные, но вы можете посмотрите, что произошло: «Новая линия» заставляет последнюю часть переопределять первую часть строки.

Но теперь он получает странно:

for i in str(image['Iptc.Application2.Caption']): 
    print i, 

Это просто печатает все символы, включая символ новой строки в правильном порядке. Но это испортило символы «Umlaut».

Это:

unicode(image['Iptc.Application2.Caption']) 

дает мне:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 41: ordinal not in range(128) 

Так как я могу иметь как: Умляут и правильно струнный Одер? Как я могу исправить эту строку?

+0

Не используйте BLOCKQUOTE, если вам необходимо включить в новые строки вывода. –

+0

Что означает 'print repr (изображение ['Iptc.Application2.Caption'])' show находится в строке? У вас, вероятно, есть '\ r', возврат каретки. –

+0

Да, это \ r. Как я могу это исправить? – JasonTS

ответ

1

Ваши данные используют другое соглашение о разделителе строк от ожидаемого. На самом деле это не проблема UTF-8.

Вы можете разделить свои линии, используя str.splitlines(); он распознает \r как разделители строк. При желании, вы можете воссоединиться свои линии с \n:

>>> sample = 'line 1\rline 2' 
>>> print sample 
line 2 
>>> sample.splitlines() 
['line 1', 'line 2'] 
>>> print '\n'.join(sample.splitlines()) 
line 1 
line 2