Seite 1 von 1

Re: Python-Armstrong-Nummer

Verfasst: Montag 24. April 2023, 07:32
von Sirius3
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 8.
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()
Die URLs sind veraltet, das Programm läuft also nicht, wie Du da was zu lesen geschaft hast, ist mir ein Rätsel. Die Klasse ist eigentlich unnötig und HTML-Code liest man mit einem Parser und geht nicht mit primitiven Text-Operationen darauf los. Das sind die nächsten Punkte, die Du an Deinem Code reparieren solltest.

Re: Python-Armstrong-Nummer

Verfasst: Montag 24. April 2023, 11:48
von grubenfox
@granda22:
granda22 hat geschrieben: Montag 24. April 2023, 00:12 Ich versuche, eine Liste von Daten in eine Excel-Tabelle einzugeben. Ich habe 34 Spalten in Excel, wo ich diese Daten eingeben muss. Spalte 1 repräsentiert Stadt 1, Spalte 2 repräsentiert Stadt 2 und so weiter...
34 Spalten und ...
granda22 hat geschrieben: Montag 24. April 2023, 00:12 # column constants
high0_col = 1
low1_col = 2
high1_col = 3
low2_col = 4
high2_col = 5
low3_col = 6
high3_col = 7
low4_col = 8
high4_col = 9
low5_col = 10
high5_col = 11
low6_col = 12
high6_col = 13
low7_col = 14
high7_col = 15
nur 15 Spalten Konstanten... da passt etwas nicht