首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何下载图像并使用Python提取Exif数据?

如何下载图像并使用Python提取Exif数据?
EN

Stack Overflow用户
提问于 2014-06-23 16:09:47
回答 2查看 2.5K关注 0票数 1

我正在尝试从下载的图像读取Exif数据。我在一个函数中将图像保存到我的计算机上,然后尝试在另一个函数中读取数据,但是我一直得到一个坏的模式错误。我已经能够从预先保存的映像中读取数据,并且只使用了._getexif(),但是当我试图对下载的图像做同样的事情时,它就无效了。我做错了什么?

下面是调用这两个函数的循环。

代码语言:javascript
复制
else:
    imgTags = findImages(url)
    for imgTag in imgTags:
        imgFileName = downloadImage(imgTag)
        testForExif(imgFileName)

从页面中查找和下载图像

代码语言:javascript
复制
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数据

代码语言:javascript
复制
def testForExif(imgFileName):
    exifData = {}
    imgFile = Image.open(imgFileName, 'rb')
    info = imgFile._getexif()
    print '\n\n' + str(info) + '\n\n'
    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函数中触发的,在前几行的某个地方。它永远不会到达第一个打印语句。

我得到的确切错误是。

ValueError:坏模式 追溯(最近一次调用):文件"C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py",第59行,main() "C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py",第56行,main testForExif(imgFileName) "C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py",第31行,testForExif imgFile = Image.open(imgFileName,‘'rb')文件“C:\Python27 27\lib\site-packages\PIL\Image.py”,第1947行,在open ValueError(“坏模式”) ValueError:坏模式中

通过玩它,我也得到了一个。

坏模式'rb',文件名;

也有错误。

我迷路了。

编辑:如果我更改:

代码语言:javascript
复制
imgFile = Image.open(imgFileName, 'rb')

代码语言:javascript
复制
imgFile = Image.open(imgFileName)

我得到了AttributeError: _getexif()的回溯:

追溯(最近一次调用):文件"C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py",第59行,main() "C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py",第56行,主testForExif(imgFileName)文件"C:\Users\HeyNow\Downloads\Python\Cookbook\Forensics\metaurl.py",第32行,在testForExif info = imgFile._getexif()文件“C:\Python27 27\lib\site-packages\PIL\Image.py”第512行中,getattr raise (Name) AttributeError:_getexif

EN

回答 2

Stack Overflow用户

发布于 2014-06-23 16:48:39

我认为,由于"downloadImages“的工作方式,您会遇到错误。如果出现任何类型的错误,您只是返回一个空字符串。但是,在尝试打开文件名之前,如果不检查文件名是否为空字符串,请返回testforexif。

代码语言:javascript
复制
Image.open('') 

将导致imgfile为空。因此,它没有属性,您将得到属性错误。

在解析网页或处理文件名时可能会出现一些错误,即抛出错误。不正确地处理错误是非常糟糕的形式,在这种情况下,它导致您的程序根本无法工作。您有try/ but语句,但是即使有错误,也可以继续。您需要做的是,如果出现错误(或为null),则更改are子句以跳过该文件名。希望这能有所帮助。

编辑:

尝试在运行时打印变量(例如文件名),以确保它们是正确的,并且图像是存在的。这也可能是一个文件类型问题。例如,您的脚本可能正在查找一些非jpg图像文件,并试图在bmp或其他方面打开exif数据。

票数 1
EN

Stack Overflow用户

发布于 2014-06-23 16:13:22

您不需要太过定义rb模式,只需使用:

代码语言:javascript
复制
Image.open(imgFileName)

唯一的Image.open()接受模式是r模式(这是默认的)。请参阅这里

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24370527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档