GV100 Parser für Python

Mit dem nachfolgenden Quellcode kann die Datenbank GV100 vom Statistischen Bundesamt mit Python eingelesen und z.B. in einer Google App Engine zur Gliederung von Adressen nach Gemeinde, Kreis, Bezirk und Bundesland genutzt werden. Das Gemeindeverzeichnis wird quartalsweise aktualisiert und steht jedem kostenlos als Download (Mrz, Jun, Sep, Dez) zur Verfügung.

Die Datei GV100.asc enthält alle 12.000 Orte aus Deutschland inklusive Postleitzahl und wird von zahlreichen Internetseiten als PLZ-Suche aufgearbeitet. Die Daten werden auch als SEO-Werkzeug zur Suchmaschinenoptimierung eingesetzt, um alle Ortsnamen mit beliebigen Keywords zu verknüpfen. Mit der Kombination von Suchbegriffen – „Autohaus Hintertupfingen“ oder „Hotel Hintertupfingen“ – können so sehr viele Internetseiten generiert werden.


#!/usr/bin/env python
#
#  GV100
#

import logging

def __open(file):
  result = None
  try:
    vpath = os.path.join(os.path.split(__file__)[0],'')
    vfile = file.replace("\\",os.sep)
    vfile = vfile.replace("/",os.sep)
    fname = os.path.join(vpath, vfile)
    result = open(fname, 'r')
  except:
    error = sys.exc_info()[1]
    logging.error("get(%s) %s" % (file, error))
  return result

def __decode(data):
  return data.decode("cp437").encode("utf-8")

gv100_format = {
 # Bundesland
 '10':[
    # ['EF1  ' ,1   ,2  ,'Satzart                         '],
    # ['EF2  ' ,3   ,8  ,'Gebietsstand                    '],
    # ['EF2U1' ,3   ,4  ,'Jahr                            '],
    # ['EF2U2' ,7   ,2  ,'Monat                           '],
    # ['EF2U3' ,9   ,2  ,'Tag                             '],
      ['EF3  ' ,11  ,8  ,'Regionalschluessel              '],
      ['EF3U1' ,11  ,2  ,'Land                            '],
    # ['EF3U2' ,13  ,1  ,'Leer                            '],
    # ['EF3U3' ,14  ,2  ,'Leer                            '],
    # ['EF3U4' ,16  ,3  ,'Leer                            '],
    # ['EF4  ' ,19  ,4  ,'Leer                            '],
      ['EF5  ' ,23  ,50 ,'Landbezeichnung                 '],
      ['EF6  ' ,73  ,50 ,'Sitz der Landesregierung        '],
    # ['EF7  ' ,123 ,6  ,'Schluesselfelder                '],
    # ['EF7U1' ,123 ,2  ,'Leer                            '],
    # ['EF7U2' ,125 ,2  ,'Leer                            '],
    # ['EF7U3' ,127 ,2  ,'Leer                            '],
    # ['EF8  ' ,129 ,72 ,'Leer                            '],
    # ['EF9  ' ,201 ,20 ,'Frei fuer landesinterne Angaben '],
 ],
 # Regierungsbezirk
 '20':[
    # ['EF1  ' ,1   ,2  ,'Satzart                              '],
    # ['EF2  ' ,3   ,8  ,'Gebietsstand                         '],
    # ['EF2U1' ,3   ,4  ,'Jahr                                 '],
    # ['EF2U2' ,7   ,2  ,'Monat                                '],
    # ['EF2U3' ,9   ,2  ,'Tag                                  '],
      ['EF3  ' ,11  ,8  ,'Regionalschluessel                   '],
      ['EF3U1' ,11  ,2  ,'Land                                 '],
      ['EF3U2' ,13  ,1  ,'Regierungsbezirk                     '],
    # ['EF3U3' ,14  ,2  ,'Leer                                 '],
    # ['EF3U4' ,16  ,3  ,'Leer                                 '],
    # ['EF4  ' ,19  ,4  ,'Leer                                 '],
      ['EF5  ' ,23  ,50 ,'Regierungsbezirksbezeichnung         '],
      ['EF6  ' ,73  ,50 ,'Verwaltungssitz des Regierungsbezirks'],
    # ['EF7  ' ,123 ,6  ,'Schluesselfelder                     '],
    # ['EF7U1' ,123 ,2  ,'Leer                                 '],
    # ['EF7U2' ,125 ,2  ,'Leer                                 '],
    # ['EF7U3' ,127 ,2  ,'Leer                                 '],
    # ['EF8  ' ,129 ,72 ,'Leer                                 '],
    # ['EF9  ' ,201 ,20 ,'Frei fuer landesinterne Angaben      '],
 ],
 # Kreis
 '40':[
    # ['EF1  ' ,1   ,2  ,'Satzart 40                     '],
    # ['EF2  ' ,3   ,8  ,'Gebietsstand                   '],
    # ['EF2U1' ,3   ,4  ,'Jahr                           '],
    # ['EF2U2' ,7   ,2  ,'Monat                          '],
    # ['EF2U3' ,9   ,2  ,'Tag                            '],
      ['EF3  ' ,11  ,8  ,'Regionalschluessel             '],
      ['EF3U1' ,11  ,2  ,'Land                           '],
      ['EF3U2' ,13  ,1  ,'Regierungsbezirk               '],
      ['EF3U3' ,14  ,2  ,'Kreis                          '],
    # ['EF3U4' ,16  ,3  ,'Leer                           '],
    # ['EF4  ' ,19  ,4  ,'Leer                           '],
      ['EF5  ' ,23  ,50 ,'Kreisbezeichnung               '],
      ['EF6  ' ,73  ,50 ,'Sitz der Kreisverwaltung       '],
    # ['EF7  ' ,123 ,6  ,'Schleusselfelder               '],
      ['EF7U1' ,123 ,2  ,'Textkennzeichen                '],
    #                     41 - Kreisfreie Stadt
    #                     42 - Stadtkreis      
    #                     43 - Kreis           
    #                     44 - Landkreis       
    #                     45 - Regionalverband 
    # ['EF7U2' ,125 ,2  ,'Leer                           '],
    # ['EF7U3' ,127 ,2  ,'Leer                           '],
    # ['EF8  ' ,129 ,72 ,'Leer                           '],
    # ['EF9  ' ,201 ,20 ,'Frei fuer landesinterne Angaben'],
 ],
 # Gemeindeverband
 '50':[
    # ['EF1  ' ,1   ,2  ,'Satzart                               '],
    # ['EF2  ' ,3   ,8  ,'Gebietsstand                          '],
    # ['EF2U1' ,3   ,4  ,'Jahr                                  '],
    # ['EF2U2' ,7   ,2  ,'Monat                                 '],
    # ['EF2U3' ,9   ,2  ,'Tag                                   '],
      ['EF3  ' ,11  ,8  ,'Regionalschluessel                    '],
      ['EF3U1' ,11  ,2  ,'Land                                  '],
      ['EF3U2' ,13  ,1  ,'Regierungsbezirk                      '],
      ['EF3U3' ,14  ,2  ,'Kreis                                 '],
    # ['EF3U4' ,16  ,3  ,'Leer                                  '],
      ['EF4  ' ,19  ,4  ,'Gemeindeverband                       '],
      ['EF5  ' ,23  ,50 ,'Verbandsbezeichnung                   '],
    # ['EF6  ' ,73  ,50 ,'Verwaltungssitz des Gemeindeverbandes '],
    # ['EF7  ' ,123 ,6  ,'Schluesselfelder                      '],
      ['EF7U1' ,123 ,2  ,'Textkennzeichen                       '],
    #                     50 verbandsfreie Gemeinde
    #                     51 Aemter
    #                     52 Samtgemeinden
    #                     53 Verbandsgemeinden
    #                     54 Verwaltungsgemeinschaften
    #                     55 Kirchspielslandgemeinden
    #                     56 Verwaltungsverbaende
    #                     57 VG Traegermodell
    #                     58 Erfuellende Gemeinde
    # ['EF7U2' ,125 ,2  ,'Leer                                  '],
    # ['EF7U3' ,127 ,2  ,'Leer                                  '],
    # ['EF8  ' ,129 ,72 ,'Leer                                  '],
    # ['EF9  ' ,201 ,20 ,'Frei fuer landesinterne Angaben       '],
 ],
 # Gemeinde
 '60':[
    # ['EF1   ' ,1    ,2  ,'Satzart 60                           '],
    # ['EF2   ' ,3    ,8  ,'Gebietsstand                         '],
    # ['EF2U1 ' ,3    ,4  ,'Jahr                                 '],
    # ['EF2U2 ' ,7    ,2  ,'Monat                                '],
    # ['EF2U3 ' ,9    ,2  ,'Tag                                  '],
      ['EF3   ' ,11   ,8  ,'Regionalschluessel                   '],
      ['EF3U1 ' ,11   ,2  ,'Land                                 '],
      ['EF3U2 ' ,13   ,1  ,'Regierungsbezirk                     '],
      ['EF3U3 ' ,14   ,2  ,'Kreis                                '],
      ['EF3U4 ' ,16   ,3  ,'Gemeinde                             '],
      ['EF4   ' ,19   ,4  ,'Gemeindeverband                      '],
      ['EF5   ' ,23   ,50 ,'Gemeindebezeichnung                  '],
    # ['EF6   ' ,73   ,50 ,'Leer                                 '],
    # ['EF7   ' ,123  ,6  ,'Schluesselfelder                     '],
      ['EF7U1 ' ,123  ,2  ,'Textkennzeichen                      '],
      ['EF7U1C' ,123  ,2  ,'Textkennzeichen                      ',
                   {
                      '60':'Markt                           ',
                      '61':'Kreisfreie Stadt                ',
                      '62':'Stadtkreis                      ',
                      '63':'Stadt                           ',
                      '64':'Kreisangehoerige Gemeinde       ',
                      '65':'gemeindefreies Gebiet, bewohnt  ',
                      '66':'gemeindefreies Gebiet, unbewohnt',
                      '67':'grosse Kreisstadt               ',
                      '68':'amtsangehoerige Gemeinde        ',
                      '69':'amtsfreie Gemeinde              ',
                   }                         
      ],
    #                       60 - Markt                           '],
    #                       61 - Kreisfreie Stadt                '],
    #                       62 - Stadtkreis                      '],
    #                       63 - Stadt                           '],
    #                       64 - Kreisangehoerige Gemeinde       '],
    #                       65 - gemeindefreies Gebiet, bewohnt  '],
    #                       66 - gemeindefreies Gebiet, unbewohnt'],
    #                       67 - grosse Kreisstadt               '],
    #                       68 - amtsangehoerige Gemeinde        '],
    #                       69 - amtsfreie Gemeinde              '],
    # ['EF7U2 ' ,125  ,2  ,'Leer                                 '],
    # ['EF7U3 ' ,127  ,2  ,'Leer                                 '],
      ['EF8   ' ,129  ,11 ,'Flaeche in ha                        '],
      ['EF9   ' ,140  ,11 ,'Bevoelkerung, insgesamt              '],
      ['EF10  ' ,151  ,11 ,'Bevoelkerung, maennlich              '],
    # ['EF11  ' ,162  ,4  ,'Leer                                 '],
    # ['EF12  ' ,166  ,10 ,'Neue Postleitzahl                    '],
      ['EF12U1' ,166  ,5  ,'PLZ der Gemeinde / PLZ des Verwaltung'],
      ['EF12U2' ,171  ,5  ,'Kennzeichnung, ob PLZ eindeutig      '],
    #                       leer = Gemeinde hat nur eine PLZ     '],
    #                       sonst = Gemeinde hat mehrere PLZ     '],
    # ['EF13  ' ,176 ,2   ,'Oberpostdirektionsbezirk             '],
    # ['EF14  ' ,178 ,4   ,'Finanzamtsbezirk                     '],
    # ['EF15  ' ,182 ,4   ,'Gerichtsbarkeit                      '],
    # ['EF15U1' ,182 ,2   ,'Oberlandesgerichtsbezirk             '],
    # ['EF15U2' ,184 ,1   ,'Landgerichtsbezirk                   '],
    # ['EF15U3' ,185 ,1   ,'Amtsgerichtsbezirk                   '],
    # ['EF16  ' ,186 ,5   ,'Arbeitsamtsbezirk                    '],
    # ['EF17  ' ,191 ,6   ,'Bundestagswahlkreise von ... bis ... '],
    # ['EF17U1' ,191 ,3   ,'aBufntrdeetesnta)gswahlkreis von ... '],
    # ['EF17U2' ,194 ,3   ,'Bundestagswahlkreis bis ...          '],
    # ['EF18  ' ,197 ,4   ,'Leer                                 '],
    # ['EF19  ' ,201 ,20  ,'ALN Frei fuer landesinterne Angaben  '],
 ],
}

for line in __open('GV100.asc'):
  line = line[:-1]
  EF1_Satzart = line[0:0+2]
  data = None
  if gv100_format.has_key(EF1_Satzart):
    data = {}
    for atr in gv100_format[EF1_Satzart]:
      key = atr[0].strip()
      off = atr[1]-1
      len = off+atr[2]
      data[key] = __decode(line[off:len]).strip()
      if type(atr[-1]) == dict:
        if atr[-1].has_key(data[key]):
          data[key] = atr[-1][data[key]]
  if EF1_Satzart == '60':
    bundesland_id = data['EF3U1']
    bezirk_id = data['EF3U2']
    kreis_id = data['EF3U3']
    gemeindeverband_id = data['EF4']
    gemeinde_id = data['EF3U4']
    gemeinde_txt = data['EF5']
    gemeinde_typ = data['EF7U1C']
    plz_id = data['EF12U1']

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: