xlsx daten lesen plz auslesen, und nach ersten 2 stellen sortieren und zählen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
elbu
User
Beiträge: 2
Registriert: Mittwoch 24. April 2013, 14:07

Hallo Forianer,

versuche mich seit einigen Tagen auch mit Python und bin programmieranfänger.
Ich kann üer openpyxl eine Exceldatei einlesen und kann auch nach der PLZ die mengen an adressen auszählen.
Ich tue mich noch schwer mit der konvertierung in die entsprechenden datentypen.
Nun möchte ich aber die PLZ nach den ersten 2 Zahlen der PLZ aufaddieren.

und das bekomme ich nicht hin.

hier mein Code, mit dem ich gespielt habe:

Code: Alles auswählen

#! Python3
import openpyxl
wb = openpyxl.load_workbook(r'C:\Users\xxxx\Desktop\xls\test.xlsx')
for name in wb.sheetnames:
    print('Tabellenblatt: ', name)

sheet = wb[name] # variable sheet war vorher ws
plz = []
plz2 = [] # mein versuch mit 2-stelliger plz
ltregion = [] # weiterer versuch mit 2-stelliger plz
ltplz = [] # und noch mehr versuche mit der plz
for row in range(2,sheet.max_row +1):
    plz.append(sheet['H' + str(row)].value)
    # plz = liste aller postleizahlen

for cutter in plz:
    plz2.append(str(cutter)[0:2])
    
    
# Liste der  5stelligen PLZ in Excel
anzahlplz = set(plz)
print('Anzahl verschiedener PLZ: ', len(anzahlplz))

# Liste der 5stelligen PLZ in Excel slicen nach 2stelligen PLZ und ein neues Set erstellen
for t in anzahlplz:
    ltregion.append(str(t)[0:2])
plzregionmenge = set(ltregion)
plzregion = list(plzregionmenge)

print('Anzahl der 2-stelligen Leitregionen:', len(plzregion))

count = 0 
i=0
for i in plzregion:
    print('plzregion: ', i)

for stkzahl in anzahlplz:
        count +=1
        print(str(count), ";", str(stkzahl), ";", plz.count(stkzahl))

# umwandlung der 5 stelligen PLZs in ein Dictionary
listofzip5 = []

for stkzahl in anzahlplz:
        d = {
            str(stkzahl) : plz.count(stkzahl)
            }
        listofzip5.append(d)

# umwandlung der 2 stelligen PLZs in ein Dictionary
listofzip2 = []

for stkzahl in anzahlplz:
        d = {
            str(stkzahl) : plz2.count(stkzahl)
            }
        listofzip2.append(d)

Kann mir hier jemand helfen? das wäre super.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@elbu: Das ist ziemlich viel, ziemlich unübersichtlicher Code eine zumindest mir unverständliche Frage.

So ganz allgemein: Verwende aussagekräftige Namen die nicht aus Abkürzungen oder gar nur einzelnen Buchstaben bestehen und keine durchnummerierten Namen. Das versteht am Ende kein Mensch, und selbst Du selbst nach zwei Wochen nicht mehr.

Dann trenne die Probleme auf. Am besten auch im Code in Funktionen die einzelne Probleme lösen und beschränke dann die Frage auf das tatsächliche Problem. Wenn das Einlesen aus Excel funktioniert, aber das erstellen eines Wörterbuchs nach Deinen Vorstellungen nicht, dann braucht der Excelteil nicht in der Frage auftauchen, denn dann reicht es ja wenn Du als Ausgangsdaten eine Liste mit Postleitzahlen hast. Wo die her kommen (Textdatei, Datenbank, Web-API, …) spielt dafür ja gar keine Rolle.

Wobei das iterieren über eine Spalte der Exceldatei einfacher gehen sollte als wie Du das da machst. Ich würde da entweder die `cell()`-Methode verwenden, damit nicht immer aus Buchstabe und Zahl ein Indexwert erstellt werden muss, oder nur über 'H' gleich die ganze Spalte abfragen.

Dann am besten ein kleines nachvollziehbares Beispiel zeigen und auch beschreiben wie das gewünschte Ergebnis aussieht.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Schwebt Dir so etwas vor? Bei Infopost kenne ich es von früher, dass man die PLZ-Bereiche angeben und zugleich die Menge der Briefe je Bereich nennen muss. Je nachdem, was Du vorhast, könnte ich mir auch eine Sortierung der tatsächlichen PLZ in die Liste je Wörterbuch-Eintrag vorstellen, so dass man die Menge der Briefe dann dynamisch berechnen und zugleich auf Grundlage der Daten im Wörterbuch noch die range angeben könnte, also von 12345 bis 12349 (min, max). Der Name wb ist sicherlich schlecht gewählt, aber mir fällt momentan kein besserer Name ein...

Code: Alles auswählen

import pprint

postleitzahlen = ["12345", "12346", "12346", "45678", "98765"]

wb = {plz[:2] : 0 for plz in postleitzahlen}

for postleitzahl in postleitzahlen:
    wb[postleitzahl[:2]] += 1

pprint.pprint(wb)
PS Ich habe das als Fingerübung wahrgenommen und konnte nicht widerstehen, ich hoffe mal, dass ich helfen kann!?
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

@pixewakb: dafür gibt es collections.Counter:

Code: Alles auswählen

from collections import Counter
wb = Counter(plz[:2] for plz in postleitzahlen)
Antworten