Verbundene Zeilen in Excel

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
DMD-OS
User
Beiträge: 39
Registriert: Freitag 28. Dezember 2018, 13:52

Freitag 10. Mai 2019, 20:26

hallo
ich beschäftige mich grad mit dem auslesen einer excel-datei:

Code: Alles auswählen

     
ID	                                   Adresse					
	Vorname	        Nachname	Straße	        Hausnummer	PLZ	Wohnort
1	Vorname 1	Nachname 1	Straße 1	Hausnummer 1	PLZ 1	Wohnort 1
2	Vorname 2	Nachname 2	Straße 2	Hausnummer 2	PLZ 2	Wohnort 2
3	Vorname 3	Nachname 3	Straße 3	Hausnummer 3	PLZ 3	Wohnort 3
dabei speicher ich jede spalte in ein dict mit dem problem, daß die verbundenen Zellen für Adresse nur einmal erkannt werden :(

Code: Alles auswählen

Tabelle1 (Sheet-Name)
ID ['ID', '', 1.0, 2.0, 3.0]
Vorname ['Adresse', 'Vorname', 'Vorname 1', 'Vorname 2', 'Vorname 3']
Nachname ['', 'Nachname', 'Nachname 1', 'Nachname 2', 'Nachname 3']
Straße ['', 'Straße', 'Straße 1', 'Straße 2', 'Straße 3']
Hausnummer ['', 'Hausnummer', 'Hausnummer 1', 'Hausnummer 2', 'Hausnummer 3']
PLZ ['', 'PLZ', 'PLZ 1', 'PLZ 2', 'PLZ 3']
Wohnort ['', 'Wohnort', 'Wohnort 1', 'Wohnort 2', 'Wohnort 3']
ich hätte aber gern, daß zusammengefügte zellen auch als solche erkannt werden.
heißt, "Adresse" soll auch in allen anderen spalten stehen.

Code: Alles auswählen

Tabelle1 (Sheet-Name)
ID ['ID', '', 1.0, 2.0, 3.0]
Vorname ['Adresse', 'Vorname', 'Vorname 1', 'Vorname 2', 'Vorname 3']
Nachname ['Adresse', 'Nachname', 'Nachname 1', 'Nachname 2', 'Nachname 3']
Straße ['Adresse', 'Straße', 'Straße 1', 'Straße 2', 'Straße 3']
Hausnummer ['Adresse', 'Hausnummer', 'Hausnummer 1', 'Hausnummer 2', 'Hausnummer 3']
PLZ ['Adresse', 'PLZ', 'PLZ 1', 'PLZ 2', 'PLZ 3']
Wohnort ['Adresse', 'Wohnort', 'Wohnort 1', 'Wohnort 2', 'Wohnort 3']
ich habe schon im netz gelesen, daß das mit formatting_info=True oder formatting_info=1 geht.
leider funktioniert dieser befehl nicht mit xlsx-dateien (nur mit xls-dateien).
ich habe jetzt meine xlsx in xls umgewandelt und es nicht zum laufen gebracht.
kann mir da jemand helfen?
mein code:

Code: Alles auswählen

from os.path import expanduser
import os
import xlrd


if __name__ == '__main__':

    input_foldername = "Dateiimport"
    input_folder = os.path.join(expanduser("~"), "Desktop", input_foldername)

    input_filename = "Input_Testfile.xlsx"
    output_filename = "Output_Testfile.xlsx"

    input_path = os.path.join(input_folder, input_filename)
    output_path = os.path.join(input_folder, output_filename)

    sheet_name = 'Tabelle1'

    wb = xlrd.open_workbook(input_path)
    dict = {}
    for sheet in wb.sheets():
        if sheet.name == sheet_name:
            print(sheet.name)
            for col in range(sheet.ncols):
                zeile_0 = sheet.cell(0, col).value
                zeile_1 = sheet.cell(1, col).value
                if zeile_0 == "ID":
                    data = [sheet.cell_value(row, col) for row in range(sheet.nrows)]
                    dict[zeile_0] = data
                elif zeile_1 == "Vorname":
                    data = [sheet.cell_value(row, col) for row in range(sheet.nrows)]
                    dict[zeile_1] = data
                elif zeile_1 == "Nachname":
                    data = [sheet.cell_value(row, col) for row in range(sheet.nrows)]
                    dict[zeile_1] = data
                elif zeile_1 == "Straße":
                    data = [sheet.cell_value(row, col) for row in range(sheet.nrows)]
                    dict[zeile_1] = data
                elif zeile_1 == "Hausnummer":
                    data = [sheet.cell_value(row, col) for row in range(sheet.nrows)]
                    dict[zeile_1] = data
                elif zeile_1 == "PLZ":
                    data = [sheet.cell_value(row, col) for row in range(sheet.nrows)]
                    dict[zeile_1] = data
                elif zeile_1 == "Wohnort":
                    data = [sheet.cell_value(row, col) for row in range(sheet.nrows)]
                    dict[zeile_1] = data

    for key, item in dict.items():
        print(key, item)
Sirius3
User
Beiträge: 9902
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 10. Mai 2019, 21:26

@DMD-OS: erst mal ein paar Anmerkungen zum Code. Alles was in ›if __name__‹-Block steht, sollte am besten in einer Funktion (üblicherweise ›main‹ genannt) stehen, um globale Variablen zu vermeiden.
Das Sheet bekommst Du am besten mit ›sheet_by_name‹. `dict` ist ein schlechter Variablennamen, zum einen, weil er nichts über seinen Inhalt verrät, zum anderen, weil das der Name des eingebauten Typs ›dict‹ ist. Die ganzen if-elif-Blöcke enthalten exakt das selbe, können also zu einem if zusammengefasst werden. Statt der Listcomprehension kannst Du gleich ›sheet.col_values‹ benutzen.

Bleibt also:

Code: Alles auswählen

import os
import xlrd

SHEET_NAME = "Tabelle1"
INPUT_FOLDER = os.path.expanduser("~/Desktop/Dateiimport")
INPUT_FILENAME = "Input_Testfile.xlsx"
OUTPUT_FILENAME = "Input_Testfile.xlsx"

def read_excel(filename):
    wb = xlrd.open_workbook(filename)
    addresses = {}
    sheet = wb.sheet_by_name(SHEET_NAME)
    for col in range(sheet.ncols):
        values = sheet.col_values(col)
        if values[0] == "ID" or values[1] in ["Vorname", "Nachname", "Straße", "Hausnummer", "PLZ", "Wohnort"]:
            addresses[values[1] or values[0]] = values
    return addresses

def main():
    input_filename = os.path.join(INPUT_FOLDER, INPUT_FILENAME)
    addresses = read_excel(input_filename)
    for key, item in addresses.items():
        print(key, item)

if __name__ == '__main__':
    main()
Jetzt ist es aber ungewöhnlich, Daten in parallelen Listen zu speichern und zudem noch den Header mit in der Liste. Das ist für die Weiterverarbeitung sehr ungeschickt.

Auf solche visuellen Effekte, wie verbundene Zellen, sollte man sich eigentlich nicht verlassen, falls doch, steht hier (https://xlrd.readthedocs.io/en/latest/a ... rged_cells) wie.

Was willst Du denn mit den Daten weiter machen?
DMD-OS
User
Beiträge: 39
Registriert: Freitag 28. Dezember 2018, 13:52

Samstag 11. Mai 2019, 12:15

hi danke für die hilfe.
ich will die einzelnen spalten getrennt "auflisten", um sie flexibel zu anderen excels anordnen zu können.
die seite kenn ich schon, komm aber nicht ganz damit klar.
ich habe die xlsx in eine xls datei geändert.
wenn ich die xls mit

Code: Alles auswählen

input_filename = "Input_Testfile.xls"
wb = xlrd.open_workbook(input_path, formatting_info=True)
öffne, funktioniert es leider nicht.
Sirius3
User
Beiträge: 9902
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 11. Mai 2019, 14:23

Was funktioniert nicht? Du öffnest nur die Datei. Kommt da eine Fehlermeldung?

Solange die Datenstruktur nicht so aufgebaut ist, dass Zusammengehörige Daten auch zusammenstehen, heißt Deine Art von Flexibilität nur, dass Du leicht Fehler machst, die schwierig zu entdecken sind.
DMD-OS
User
Beiträge: 39
Registriert: Freitag 28. Dezember 2018, 13:52

Samstag 11. Mai 2019, 21:03

dachte ich habe das schon hier gesagt
ich habe schon im netz gelesen, daß das mit formatting_info=True oder formatting_info=1 geht.
leider funktioniert dieser befehl nicht mit xlsx-dateien (nur mit xls-dateien).
nachdem ich die xlsx datei in eine xls datei umgewandelt habe, habe ich das versucht

Code: Alles auswählen

import os
import xlrd

SHEET_NAME = "Tabelle1"
INPUT_FOLDER = os.path.expanduser("~/Desktop/Dateiimport")
# INPUT_FILENAME = "Ruby Hotels MdI-Datei_mm_2019-05-07.xlsx"
INPUT_FILENAME = "Input_Testfile.xls"
# INPUT_FILENAME = "Merged_Testfile.xlsx"
OUTPUT_FILENAME = "Input_Testfile.xlsx"


def read_excel(filename):
    wb = xlrd.open_workbook(INPUT_FILENAME, formatting_info=True)
    addresses = {}
    sheet = wb.sheet_by_name(SHEET_NAME)
    for col in range(sheet.ncols):
        values = sheet.col_values(col)
        if values[0] == "ID" or values[1] in ["VORNAME", "NACHNAME", "STRASSE", "HAUSNUMMER", "PLZ", "WOHNORT"]:
            addresses[values[1] or values[0]] = values
    return addresses


def main():
    input_filename = os.path.join(INPUT_FOLDER, INPUT_FILENAME)
    addresses = read_excel(input_filename)
    for key, item in addresses.items():
        print(key, item)


if __name__ == '__main__':
    main()
formatting_info=True scheint aber auch nicht mit xls dateien zu funktionieren.
fehlermeldung dazu

Code: Alles auswählen

C:\Users\colling\Documents\PyCharm\Interface\venv\Scripts\python.exe C:/Users/colling/Documents/PyCharm/Dateiimport/MAIN.py
Traceback (most recent call last):
  File "C:/Users/colling/Documents/PyCharm/Dateiimport/MAIN.py", line 46, in <module>
    main()
  File "C:/Users/colling/Documents/PyCharm/Dateiimport/MAIN.py", line 40, in main
    addresses = read_excel(input_filename)
  File "C:/Users/colling/Documents/PyCharm/Dateiimport/MAIN.py", line 28, in read_excel
    wb = xlrd.open_workbook(INPUT_FILENAME, formatting_info=True)
  File "C:\Users\colling\Documents\PyCharm\Interface\venv\lib\site-packages\xlrd\__init__.py", line 111, in open_workbook
    with open(filename, "rb") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'Input_Testfile.xls'
es liegt an dieser zeile: wb = xlrd.open_workbook(INPUT_FILENAME, formatting_info=True). ohne formatting_info=True funktioniert alles.
DMD-OS
User
Beiträge: 39
Registriert: Freitag 28. Dezember 2018, 13:52

Samstag 11. Mai 2019, 21:03

dachte ich habe das schon hier gesagt
ich habe schon im netz gelesen, daß das mit formatting_info=True oder formatting_info=1 geht.
leider funktioniert dieser befehl nicht mit xlsx-dateien (nur mit xls-dateien).
nachdem ich die xlsx datei in eine xls datei umgewandelt habe, habe ich das versucht

Code: Alles auswählen

SHEET_NAME = "Tabelle1"
INPUT_FOLDER = os.path.expanduser("~/Desktop/Dateiimport")
# INPUT_FILENAME = "Ruby Hotels MdI-Datei_mm_2019-05-07.xlsx"
INPUT_FILENAME = "Input_Testfile.xls"
# INPUT_FILENAME = "Merged_Testfile.xlsx"
OUTPUT_FILENAME = "Output_Testfile.xls"

def read_excel(filename):
    wb = xlrd.open_workbook(filename, formatting_info=True)
    addresses = {}
    sheet = wb.sheet_by_name(SHEET_NAME)
    for col in range(sheet.ncols):
        values = sheet.col_values(col)
        if values[0] == "ID" or values[1] in ["VORNAME", "NACHNAME", "STRASSE", "HAUSNUMMER", "PLZ", "WOHNORT"]:
            addresses[values[1] or values[0]] = values
    return addresses


def main():
    input_filename = os.path.join(INPUT_FOLDER, INPUT_FILENAME)
    addresses = read_excel(input_filename)
    for key, item in addresses.items():
        print(key, item)

if __name__ == '__main__':
    main()
meine ausgabe:

Code: Alles auswählen

ID ['ID', '', 1.0, 2.0, 3.0]
VORNAME ['', 'VORNAME', 'Vorname_1', 'Vorname_2', 'Vorname_3']
STRASSE ['', 'STRASSE', 'Straße_1', 'Straße_2', 'Straße_3']
HAUSNUMMER ['', 'HAUSNUMMER', 'Hausnummer_1', 'Hausnummer_2', 'Hausnummer_3']
PLZ ['', 'PLZ', 'PLZ_1', 'PLZ_2', 'PLZ_3']
WOHNORT ['', 'WOHNORT', 'Wohnort_1', 'Wohnort_2', 'Wohnort_3']
ich hätte aber gern

Code: Alles auswählen

ID ['ID', '', 1.0, 2.0, 3.0]
VORNAME ['Adresse', 'VORNAME', 'Vorname_1', 'Vorname_2', 'Vorname_3']
STRASSE ['Adresse', 'STRASSE', 'Straße_1', 'Straße_2', 'Straße_3']
HAUSNUMMER ['Adresse', 'HAUSNUMMER', 'Hausnummer_1', 'Hausnummer_2', 'Hausnummer_3']
PLZ ['Adresse', 'PLZ', 'PLZ_1', 'PLZ_2', 'PLZ_3']
WOHNORT ['Adresse', 'WOHNORT', 'Wohnort_1', 'Wohnort_2', 'Wohnort_3']
:(
Sirius3
User
Beiträge: 9902
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 11. Mai 2019, 21:27

Wenn xlrd nicht funktioniert, dann nimm halt openpyxl.

Und die Fehlermeldung hat entgegen Deiner Aussage nichts mit formatting_info zu tun, weil sie eindeutig sagt, dass die Datei Input_Testfile.xls nicht existiert.

Was Du willst ist klar, und dass ich das für nicht sinnvoll halte, habe ich auch schon gesagt.
Antworten