#python #python-imaging-library #exif
#python #python-imaging-library #exif
Вопрос:
Я пытаюсь прочитать данные Exif из загруженного изображения. Я сохраняю изображение на свой компьютер в одной функции, затем пытаюсь прочитать данные в другой функции, но продолжаю получать ошибку bad mode. Я смог прочитать данные из предварительно сохраненного изображения и просто использовал ._getexif() но когда я пытаюсь сделать то же самое с загружаемым изображением, оно не работает. Что я делаю не так?
Вот цикл, который вызывает две функции.
else:
imgTags = findImages(url)
for imgTag in imgTags:
imgFileName = downloadImage(imgTag)
testForExif(imgFileName)
Найдите и загрузите изображения со страницы
def findImages(url):
print '[*] Finding images on ' url
urlContent = urllib2.urlopen(url).read()
soup = BeautifulSoup(urlContent)
imgTags = soup.findAll('img')
return imgTags
def downloadImage(imgTag):
try:
print '[ ] Downloading image...'
imgSrc = imgTag['src']
imgContent = urllib2.urlopen(imgSrc).read()
imgFileName = basename(urlsplit(imgSrc)[2])
imgFile = open(imgFileName, 'wb')
imgFile.write(imgContent)
imgFile.close()
return imgFileName
except:
return ''
Прочитайте данные exif
def testForExif(imgFileName):
exifData = {}
imgFile = Image.open(imgFileName, 'rb')
info = imgFile._getexif()
print 'nn' str(info) 'nn'
if info:
for (tag, value) in info.items():
decoded = TAGS.get(tag, tag)
exifData[decoded] = value
exifGPS = exifData['GPSInfo']
if exifGPS:
print '[ ] ' imgFileName ' contains GPS MetaData'
Я полагаю, что ошибка «плохого режима» возникает в функции testsForExif, где-то в первых двух строках. Он никогда не доходит до первого оператора печати.
Точная ошибка, которую я получаю, такова.
Ошибка значения: неправильный режим
Трассировка (последний последний вызов): файл «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 59, в файле main() «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 56, в основном файле testForExif(imgFileName) «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 31, в testForExif imgFile = Image.open(imgFileName, ‘rb’) Файл «C:Python27libsite-packagesPILImage.py «, строка 1947, в open raise ValueError(«плохой режим») ValueError: плохой режим
Играя с ним, я также получил.
Плохой режим ‘rb’, имя файла;
Также ошибка.
Я потерялся.
РЕДАКТИРОВАТЬ: если я изменю:
imgFile = Image.open(imgFileName, 'rb')
Для
imgFile = Image.open(imgFileName)
Я получаю AttributeError: _getexif()
Трассировка:
Трассировка (последний последний вызов): файл «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 59, в файле main() «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 56, в основном файле testForExif(imgFileName) «C:UsersHeyNowDownloadsPythonCookbookForensicsmetaurl.py «, строка 32, в файле testForExif info = imgFile._getexif() «C:Python27libsite-packagesPILImage.py «, строка 512, вgetattr вызывает ошибку атрибута (имя) Ошибка атрибута: _getexif
Комментарии:
1. пожалуйста, всегда включайте обратную трассировку
2. какой у вас тип изображения? изображения png не содержат данных exif
Ответ №1:
Я думаю, вы получаете ошибки из-за того, как работает «downloadImages». Вы просто возвращаете пустую строку в случае возникновения каких-либо ошибок. Однако, вернувшись в свой тест, если вы не проверяете, не является ли имя файла пустой строкой, прежде чем пытаться его открыть.
Image.open('')
приведет к тому, что imgfile будет None. Итак, у него нет атрибутов, и вы получаете ошибку атрибута.
Вероятно, в вашем синтаксическом анализе веб-страницы или обработке имен файлов есть какая-то ошибка, которая выдает ошибки. Неправильно обрабатывать ошибки — это очень плохой тон, и в этом случае это приводит к тому, что ваша программа вообще не функционирует. У вас есть оператор try / except, но вы просто продолжаете, даже если есть ошибки. Что вам нужно сделать, это изменить предложение except, чтобы пропустить это имя файла, если есть ошибки (или оно равно null). Надеюсь, это поможет.
Редактировать:
Попробуйте печатать свои переменные по ходу работы (например, имена файлов), чтобы убедиться, что они верны и изображения существуют. Это также может быть проблемой типов файлов. Например, возможно, ваш скрипт находит некоторые файлы изображений, отличные от jpg, и пытается открыть данные exif в bmp или что у вас есть.
Комментарии:
1. Спасибо… и на данный момент все помогает. 🙂 Но я знаю, что он находит изображения на странице, потому что он их загружает. Похоже, что он проходит мимо функции загрузки изображения. Также я убрал аспект try / except, и он по-прежнему делает то же самое.
Ответ №2:
Вам не нужно слишком определять rb
режим, просто используйте:
Image.open(imgFileName)
Единственный Image.open()
приемлемый режим — это r
режим (который используется по умолчанию). Смотрите здесь
Комментарии:
1. Я пробовал это таким образом, но все равно выдает ту же ошибку.