为什么“提高IOError(”无法识别图像文件“)”只显示部分时间? [英] Why is "raise IOError("cannot identify image file")"showing up only part of the time?

查看:104
本文介绍了为什么“提高IOError(”无法识别图像文件“)”只显示部分时间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了一个小程序,从 NOAA 下载最新的每日潮汐图,并在其中添加了一个文本表。包含潮汐信息的图像,然后将此图像设置为我的桌面壁纸。

I wrote a little program which downloads the latest daily tide graph from NOAA, adds a text table to the image containing tidal information, and then sets this image as my desktop wallpaper.

from bs4 import BeautifulSoup
import Image, ImageDraw, ImageFont
from urllib import urlretrieve
import urllib2
import time
import ctypes
import sys
import os
import datetime
import traceback


def Fetch_tideGraph():
    # Fetch the Tides Graph .gif
    #
    # Fetch the Station Home Page
    try:
        url = 'http://tidesandcurrents.noaa.gov/noaatidepredictions/viewDailyPredictions.jsp?Stationid=8637689'
        page = urllib2.urlopen(url)
        soup = BeautifulSoup(page.read())

        # Find the Url to the tides graph
        ImgElement = str(soup.find_all('input', { "alt" : "Daily Tide Prediction graphical plot" }))
        soup = BeautifulSoup(ImgElement)
        tag = soup.input
        src = str(tag['src'])
        imgUrl = 'http://tidesandcurrents.noaa.gov/noaatidepredictions' + src.lstrip('.')
        print imgUrl
    except Exception, e:
        print "Failed to Load Webpage"
        traceback.print_exc()
        raw_input('Press Enter to exit...')
        sys.exit()

    # Download the tide graph
    try:
        print "Downloading gif....."
        urlretrieve(imgUrl, "C:\\Users\\Jack\\Documents\\Py Projects\\tides.gif")
        # Allow time for image to save:
        time.sleep(5)
        print "Gif Downloaded."
    except:
        print "Failed to Download new GIF"
        raw_input('Press Enter to exit...')
        sys.exit()

    # Convert gif to jpg
    try:
        print "Converting GIF to JPG...."
        Image.open("C:\\Users\\Jack\\Documents\\Py Projects\\tides.gif").convert('RGB').save("C:\\Users\\Jack\\Documents\\Py Projects\\tides.jpg")
        print "Image Converted"
    except Exception, e:
        print "Conversion FAIL:", sys.exc_info()[0]
        traceback.print_exc()
        pass

def update_wallpaper():
    # Change the Wallpaper
    imgPath = 'C:\\Users\\Jack\\Documents\\Py Projects\\tides.jpg'
    SPI_SETDESKWALLPAPER = 20
    try:
        print "Updating WallPaper..."
        ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, imgPath, 0)
        print "Wallpaper Updated"
    except:
        print "Wallpaper update FAIL"
        raw_input('Press Enter to exit...')

def todays_tide():
    # Print Table of Todays Tides
    # Open Tide Tables and Image File:
    try:
        info = open('C:\\Users\\Jack\\Documents\\Py Projects\\AnnualTides.txt', 'r')
        img = Image.open('C:\\Users\\Jack\\Documents\\Py Projects\\tides.jpg')
    except IOError:
        print "Tide table look-up failed."
        traceback.print_exc()
    # Load Font:
    f = ImageFont.load_default()
    draw = ImageDraw.Draw(img)
    # Lookup todays tides by matching date to table:
    now = datetime.datetime.now()
    date = now.strftime("%Y/%m/%d")
    tomorrow = now.strftime("%Y/%m/") + str(now.day+1)
    # Draw on image:
    y = 30
    head = '   Date    Day Time      Ft cm High/Low'
    draw.text((150, 20), head, (0,0,0), font=f)
    for line in info.readlines():
        if date in line or tomorrow in line:
            line = line.replace('\t', ' ')
            draw.text((150, y), line, (0,0,0), font=f)
            y += 10
    info.close()
    img.save("C:\\Users\\Jack\\Documents\\Py Projects\\tides.jpg")




##########################################

def main():
    try:
        Fetch_tideGraph()
        todays_tide()
        update_wallpaper()
        raw_input('Press Enter to exit...')
    except:
        print "Error in main()", sys.exc_info()[0]
        raw_input('Press Enter to exit...')

###########################################

if __name__ == "__main__":
    main()

代码,尽管相当难看,似乎工作得很好,除了我能做的一个小bug似乎没有挤压。大多数情况下,当我运行程序时,一切顺利,但每次运行我得到以下输出:

The code, despite being rather ugly, seems to work well enough save for one little bug that I can not seem to squash. Most of the time when I run the program everything goes smooth, but every couple of runs I get the following output:

>>> 
http://tidesandcurrents.noaa.gov/noaatidepredictions/serveimage?filename=images/8637689/21072012/855/8637689_2012-07-22.gif
Downloading gif.....
Gif Downloaded.
Converting GIF to JPG....
Conversion FAIL: <type 'exceptions.IOError'>
Traceback (most recent call last):
  File "C:\Users\Jack\Documents\Py Projects\Tides.py", line 54, in Fetch_tideGraph
    Image.open("C:\\Users\\Jack\\Documents\\Py Projects\\tides.gif").convert('RGB').save("C:\\Users\\Jack\\Documents\\Py Projects\\tides.jpg")
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 1980, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file
Updating WallPaper...
Wallpaper Updated
Press Enter to exit...
>>> 

帮助我理解并解决此错误。为什么它只出现在部分时间?

Help me to understand and remedy this Error. Why does it only occur part of the time?

推荐答案

IOError建议您的gif文件不完整,因此无法识别为PIL的图像。最可能的问题是你的下载需要更长的时间来完成,而不是你在 try:块中允许下载gif文件的5秒。

The IOError suggests your gif file is not complete, and thus not recognizable as an Image to PIL. The most likely issue is that your download is taking longer to complete than the 5 seconds you're allowing in the try: block to download the gif file.

您可以尝试其他一些提取url的方法,以确保在继续之前获得完整的文件。 这个有一个进度条,但也尝试此处此处

You might try a couple other url-fetching approaches to make sure you get a complete file before continuing. This one has a progress bar, but also try here and here.

这篇关于为什么“提高IOError(”无法识别图像文件“)”只显示部分时间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆