Vor dem Doppelpunkt setzt man kein Leerzeichen.
Du scheinst noch Python2 zu benutzen, was man aber seit etlichen Jahren nicht mehr machen sollte.
Wenn man Variablen durchnummeriert, dann macht man etwas falsch. In Deinem Fall willst Du überall dort Listen verwenden.
Variablennamen und Funktionen schreibt man komplett klein, Klassen dagegen mit Großem Anfangsbuchstaben. ›city‹ ist deshalb sehr verwirrend, weil niemand damit eine Klasse verbindet.
Die 0 als Dummywerte ist sehr schlecht für die Höchst-, bzw. Tiefsttemperaturen, weil das ja wirklich reale Temperaturen sein können.
Das was Du da in den Kommentaren als „Array” bezeichnest, ist eine Liste.
Durch Dein vieles Kopieren scheinst Du ein paar Fehler eingebaut zu haben, denn ansonsten machen die Zeilen bei Position 1, 5 und 6 keinen Sinn.
Listen und Schleife vermeiden solche Fehler, weil der Code nur einmal existiert.
Statt ›rfind‹ solltest Du einfach ›in‹ verwenden, weil Du mit der Position ja gar nichts machst.
`os.chdir` ist auskommentiert, sollte man aber eh nie in einem Programm verwenden.
›c‹ ist ein schlechter Name für eine Stadt.
Der None-Wert, den Du workbook zuweist, wird gar nie verwendet, kann also weg.
Ohne die ganzen nummierierten Variablen kommen wir dann ungefähr hier raus:
Code: Alles auswählen
from xlutils.copy import copy
from xlrd import open_workbook
import urllib
from datetime import datetime, timedelta
CITIES = [
#BRITISH COLUMBIA CITIES
('Prince George', 'http://www.weatheroffice.gc.ca/city/pages/bc-79_metric_e.html'),
('Kamloops', 'http://www.weatheroffice.gc.ca/city/pages/bc-45_metric_e.html'),
('Blue River', 'http://www.weatheroffice.gc.ca/city/pages/bc-22_metric_e.html'),
('High Level', 'http://www.weatheroffice.gc.ca/city/pages/ab-24_metric_e.html'),
('Peace River', 'http://www.weatheroffice.gc.ca/city/pages/ab-25_metric_e.html'),
('Jasper', 'http://www.weatheroffice.gc.ca/city/pages/ab-70_metric_e.html'),
('Edmonton', 'http://www.weatheroffice.gc.ca/city/pages/ab-50_metric_e.html'),
('Calgary', 'http://www.weatheroffice.gc.ca/city/pages/ab-52_metric_e.html'),
#SASKATCHEWAN CITIES
('Biggar', 'http://www.weatheroffice.gc.ca/city/pages/sk-2_metric_e.html'),
('Saskatoon', 'http://www.weatheroffice.gc.ca/city/pages/sk-40_metric_e.html'),
('Melville', 'http://www.weatheroffice.gc.ca/city/pages/sk-8_metric_e.html'),
('Canora', 'http://www.weatheroffice.gc.ca/city/pages/sk-3_metric_e.html'),
('Yorkton', 'http://www.weatheroffice.gc.ca/city/pages/sk-33_metric_e.html'),
#MANITOBA CITIES
('Winnipeg', 'http://www.weatheroffice.gc.ca/city/pages/mb-38_metric_e.html'),
('Sprague', 'http://www.weatheroffice.gc.ca/city/pages/mb-23_metric_e.html'),
#ONTARIO CITIES
('Thunder Bay', 'http://www.weatheroffice.gc.ca/city/pages/on-100_metric_e.html'),
('Sioux Lookout', 'http://www.weatheroffice.gc.ca/city/pages/on-135_metric_e.html'),
('Armstrong', 'http://www.weatheroffice.gc.ca/city/pages/on-111_metric_e.html'),
('Hornepayne', 'http://www.weatheroffice.gc.ca/city/pages/on-78_metric_e.html'),
('Sudbury', 'http://www.weatheroffice.gc.ca/city/pages/on-40_metric_e.html'),
('South Parry', 'http://www.weatheroffice.gc.ca/city/pages/on-103_metric_e.html'),
('Toronto', 'http://www.weatheroffice.gc.ca/city/pages/on-144_metric_e.html'),
('Kingston', 'http://www.weatheroffice.gc.ca/city/pages/on-69_metric_e.html'),
('Cornwall', 'http://www.weatheroffice.gc.ca/city/pages/on-152_metric_e.html'),
#QUEBEC CITIES
('Montreal', 'http://www.weatheroffice.gc.ca/city/pages/qc-147_metric_e.html'),
('Quebec', 'http://www.weatheroffice.gc.ca/city/pages/qc-133_metric_e.html'),
('La Tuque', 'http://www.weatheroffice.gc.ca/city/pages/qc-155_metric_e.html'),
('Saguenay', 'http://www.weatheroffice.gc.ca/city/pages/qc-167_metric_e.html'),
('Riviere-du-loup', 'http://www.weatheroffice.gc.ca/city/pages/qc-109_metric_e.html'),
#NOVA SCOTIA CITIES
('Truro', 'http://www.weatheroffice.gc.ca/city/pages/ns-25_metric_e.html'),
('Halifax', 'http://www.weatheroffice.gc.ca/city/pages/ns-19_metric_e.html'),
# NEW BRUNSWICK CITIES
('Edmundston', 'http://www.weatheroffice.gc.ca/city/pages/nb-32_metric_e.html'),
('Moncton', 'http://www.weatheroffice.gc.ca/city/pages/nb-36_metric_e.html'),
('Sarnia', 'http://www.weatheroffice.gc.ca/city/pages/on-147_metric_e.html'),
]
class City:
def __init__(self, city_name, link):
self.name = city_name
self.url = link
self.temperatures = []
def retrieve_temperatures(self, date):
with urllib.request.urlopen(self.url) as response:
lines = response.read().decode('utf8').splitlines()
for day in range(7):
current_date = date + timedelta(days=day)
for index, line in enumerate(lines):
if f'title="{current_date:%A}"' in line:
high = lines[index + 5].split('&')[0].split('>')[-1]
low = lines[index + 20].split('&')[0].split('>')[-1]
break
else:
high = low = None
self.temperatures.append((high, low))
def main():
date = datetime.now()
file_name = 'fcst_hilo_TEST.xls'
new_file_name = 'fcst_hilo.xls'
workbook = copy(open_workbook(file_name))
sheet = workbook.get_sheet(0)
for row, (name, url) in enumerate(CITIES):
city = City(name, url)
city.retrieve_temperatures(date)
for index, (high, low) in enumerate(city.temperatures):
sheet.write(row, index*2 + 1, high)
sheet.write(row, index*2 + 2, low)
workbook.save(new_file_name)
if __name__ == '__main__':
main()