我写了一个小程序,从NOAA下载最新的每日潮汐图,在包含潮汐信息的图像上添加一个文本表,然后将此图像设置为我的桌面壁纸。
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()
代码,尽管相当丑陋,似乎工作得很好,除了一个我似乎无法压制的小虫子。大多数时候,当我运行程序时,一切顺利,但每次运行我得到以下输出:
>>>
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...
>>>
帮助我理解并解决此错误。为什么它只出现在部分时间?