Python: .xlsx und String einer Zelle in Spalte?

1 Antwort

Eine Möglichkeit, dies mit Python und der Bibliothek "pandas" zu erreichen, wäre folgendes:

  1. Laden Sie die xlsx-Datei in pandas ein:

Copy code
import pandas as pd data = pd.read_excel("dateiname.xlsx")
  1. Verwenden Sie den DataFrame-Befehl "loc", um nach dem gewünschten Wert in der ersten Spalte zu suchen:

Copy code
search_value = "geh" result = data.loc[data[data.columns[0]] == search_value]
  1. Verwenden Sie den Befehl "iloc" um den Wert aus der zweiten Spalte zu extrahieren:

Copy code
value = result.iloc[0,1] print(value)

Das oben genannte Skript sollte den Wert "8" ausgeben.

Es gibt verschiedene Möglichkeiten um mit xlsx zu arbeiten, aber die pandas Bibliothek ist eine der gängigsten. Es gibt auch andere Libraries wie openpyxl, xlrd, xlwt usw. die man verwenden kann.

HagbardCeline88 
Fragesteller
 24.01.2023, 07:50

Danke ich schau mir das dann mal an; hatte in der Zwischenzeit z.B.

from openpyxl import load_workbook
                wb = load_workbook(path_telefonliste)
                ws = wb['Aktiv']
                for cell in ws['A1':'A300']:
                    if main_input in cell[0].value:
                        print(cell[0].value)

allerdings ist das dann die Zelle aus der ersten spalte, wollte natürlich dann die daneben. hm.. naja ich schau mir deine lösugn dann mal an :)

1
HagbardCeline88 
Fragesteller
 24.01.2023, 08:00

was macht denn copy code? o0

also ich nutze z.b. als basis die test.xlsx, das hatte ich vielleicht vergessen zu erwähnen

0
daCypher  24.01.2023, 08:43
@HagbardCeline88

"Copy code" ist kein python-Befehl. Das steht nur auf der Webseite, von der KaterKarlo das kopiert hat. Wahrscheinlich ChatGPT.

Du bist mit deinem Code schon ziemlich nah am Ergebnis dran. In cell hast du ja schon die Zelle stehen, in der du den Namen gefunden hast. Mit cell.row kannst du die Zeile auslesen, wo der Wert gefunden wurde. mit ws.cell(row, column) kannst du den Wert aus einer bestimmten Zeile und Spalte auslesen.

Zusammengefasst:

print(ws.cell(cell.row, 2).value)
0
HagbardCeline88 
Fragesteller
 24.01.2023, 11:02
@daCypher

Hey danke.. hm ich bin noch n Anfänger, also ich versteh nichtmal genau was cell[0].value tut (also wieso [0] ?)

Der folgende Code geht jedenfalls leider nicht :(

from openpyxl import load_workbook
                wb = load_workbook(path_telefonliste)
                ws = wb['Aktiv']
                o=input(main_input)
                found_name_tel=0
                for cell in ws['B2':'B300']:
                    if main_input == cell[0].value:#==3:
                        #print((cell[0]).value)
                        print(ws.cell(cell.row, 2).value)
                        found_name_tel=1
                if found_name_tel==0:
                    clearConsole()
                    dev_po
                    print("Es wurde kein Eintrag gefunden.)")
                    back=input("\n<enter>")
                    main_base()
0
HagbardCeline88 
Fragesteller
 24.01.2023, 12:53
@HagbardCeline88

Ups war leicht unvollständig:

if 'TL' or 'tl' in main_input:
                if 'TL' in main_input:
                    main_input=main_input.split('TL')[1]
                    main_input=main_input.lstrip().rstrip()
                if 'Tl' in main_input:
                    main_input=main_input.split('Tl')[1]
                    main_input=main_input.lstrip().rstrip()
                if 'tl' in main_input:
                    main_input=main_input.split('tl')[1]
                    main_input=main_input.lstrip().rstrip()
                main_input=main_input.upper()
                path_telefonliste="C:\\pm_data\\tel.xlsx"


                from openpyxl import load_workbook
                wb = load_workbook(path_telefonliste)
                ws = wb['Aktiv']
                o=input(main_input)
                found_name_tel=0
                for cell in ws['B2':'B300']:
                    if main_input == cell[0].value:#==3:
                        #print((cell[0]).value)
                        print(ws.cell(cell.row, 2).value)
                        found_name_tel=1
                if found_name_tel==0:
                    clearConsole()
                    dev_po
                    print("Es wurde kein Eintrag gefunden.)")
                    back=input("\n<enter>")
                    main_base()
                
0
HagbardCeline88 
Fragesteller
 24.01.2023, 13:14
@HagbardCeline88

So habs gelöst, vermutlich etwas umständlich, aber es macht was ich wollte ^^

if 'TL' or 'tl' in main_input:
                if 'TL' in main_input:
                    main_input=main_input.split('TL')[1]
                    main_input=main_input.lstrip().rstrip()
                if 'Tl' in main_input:
                    main_input=main_input.split('Tl')[1]
                    main_input=main_input.lstrip().rstrip()
                if 'tl' in main_input:
                    main_input=main_input.split('tl')[1]
                    main_input=main_input.lstrip().rstrip()
                main_input=main_input.upper()
                path_telefonliste="C:\\pm_data\\tel.xlsx"


                from openpyxl import load_workbook
                wb = load_workbook(path_telefonliste)
                ws = wb['Aktiv']
                o=input(main_input)
                found_name_tel=0
                for cell in ws['B2':'B300']:
                    if main_input == cell[0].value:#==3:
                        #print((cell[0]).value)
                        name_coord=((cell[0]).coordinate)
                        tel_complete=name_coord.replace('B','D')
                        tel_=ws[tel_complete].value # Festnetz komplett


                        tel_durchwahl=name_coord.replace('B','C')
                        tel_durchwahl=ws[tel_durchwahl].value # Durchwahl komplett


                        tel_mobil=name_coord.replace('B','E')
                        tel_mobil=ws[tel_mobil].value # Durchwahl komplett


                        ma_mail=name_coord.replace('B','F')
                        ma_mail=ws[ ma_mail].value # Durchwahl komplett


                        ma_funktion=name_coord.replace('B','G')
                        ma_funktion=ws[ma_funktion].value # Durchwahl komplett


                        ma_location=name_coord.replace('B','H')
                        ma_location=ws[ma_location].value # Durchwahl komplett
                        
                        u=input(tel_)
                        u=input(tel_durchwahl)
                        u=input(tel_mobil)
                        u=input(ma_mail)
                        u=input(ma_funktion)
                        u=input(ma_location)
                        
                        found_name_tel=1
0
daCypher  25.01.2023, 11:19
@HagbardCeline88

Ich bin gestern leider nicht mehr dazu gekommen, dir zu antworten. Ich nehme deinen code mal etwas auseinander:

Für was ist dieser Block gut?

if 'TL' or 'tl' in main_input:
    if 'TL' in main_input:
        main_input=main_input.split('TL')[1]
        main_input=main_input.lstrip().rstrip()
    if 'Tl' in main_input:
        main_input=main_input.split('Tl')[1]
        main_input=main_input.lstrip().rstrip()
    if 'tl' in main_input:
        main_input=main_input.split('tl')[1]
        main_input=main_input.lstrip().rstrip()
    main_input=main_input.upper()

Anscheinend hast du in main_input einen Suchstring stehen (sowas, wie "Ich suche TL Günther Jauch")

Die Bedingung "if 'TL' or 'tl' in main_input" ist immer wahr. Der Operator "or" vergleicht immer zwei komplette Wahrheitsausdrücke. Also aus der Zeile wird "if ('TL') or ('tl' in main_input)". Das heißt für 'TL' wird nicht geprüft, ob es in main_input steht, sondern nur, ob 'TL' ein wahrer Wert ist (was bei Strings immer dann der Fall ist, wenn sie nicht leer sind.

Das danach könntest du ein bisschen abkürzen:

if 'TL' in main_input.upper():
    main_input=main_input.upper().split('TL')[1].strip()

Wobei ich dir davon abraten würde eine Variable für verschiedene Dinge zu benutzen. Du benutzt "main_input" irgendwie als Platzhalter für alles. Das kann später mal für Verwirrung sorgen, wenn du das Programm weiter ausbauen willst.

Bei den Zeilen danach hab ich erstmal nichts zu meckern ^^

    path_telefonliste="C:\\pm_data\\tel.xlsx"
    # Du könntest auch r"C:\pm_data\tel.xlsx" schreiben.
    # Das "r" vor den Anführungszeichen heißt "raw-Modus",
    # also die Backslashes werden dadurch nicht als 
    # Steuerzeichen gesehen

    from openpyxl import load_workbook
    wb = load_workbook(path_telefonliste)
    ws = wb['Aktiv']

Danach speicherst du in o eine Benutzereingabe und benutzt dafür den Wert aus main_input. Wofür? Soll das Programm da einfach nur anhalten, bis du geprüft hast, ob main_input Sinn ergibt?

Naja, wie dem auch sei, danach durchsuchst du die Spalte B nach dem Namen und schreibst die gefundenen Werte in verschiedene Variablen (die du dann per input() ausgibst!?) Das kannst du auch etwas abkürzen und ich kann im gleichen Zug beantworten, warum du dein Suchwort mit cell[0] vergleichen musst.

ws['B2':'B300'] gibt ein zweidimensionales Array aus. In deinem Fall sieht es so aus:

[
 [B2],
 [B3],
 [B4],
 [B5],
 ...
]

Jede Zeile ist dabei selbst eine Liste von Zellen. Wenn du z.B. ws['B2':'H300'] machen würdest, würden pro Zeile die ganzen Zellen mitkommen, also etwa so:

[
 [B2, C2, D2, E2, F2, G2, H2],
 [B3, C3, D3, E3, F3, G3, H3],
 [B4, C4, D4, E4, F4, G4, H4],
 [B5, C5, D5, E5, F5, G5, H5],
 ...
]

Das heißt, du brauchst nicht kompliziert die Adresse der jeweiligen Zelle berechnen, sondern kannst einfach die ganze Zeile auf einmal auslesen.

Ich hab meine Änderungen mal zusammengefasst:

if 'TL' in main_input.upper():
    main_input=main_input.upper().split('TL')[1].strip()

    path_telefonliste=r"C:\pm_data\tel.xlsx"

    from openpyxl import load_workbook
    wb = load_workbook(path_telefonliste)
    ws = wb['Aktiv']

    # alle übereinstimmenden Zeilen suchen
    found_rows = [row for row in ws[f"B2:H{ws.max_row}"] if row[0].value == main_input]
    found_name_tel=len(found_rows)

    for row in found_rows:
        # das hier nennt sich "Variable Unpacking". Weist einfach mehreren Variablen die Werte aus einer Liste zu
        # Geht aber nur, wenn die Anzahl der Werte übereinstimmt
        tel_durchwahl, tel_complete, tel_mobil, ma_mail, ma_funktion, ma_location = [cell.value for cell in row]

        print(f"""Tel. Komplett: {tel_complete}
Tel. Durchwahl: {tel_durchwahl}
Tel. Mobil: {tel_mobil}
E-Mail: {ma_mail}
Funktion: {ma_funktion}
Ort: {ma_location}""")
1
HagbardCeline88 
Fragesteller
 26.01.2023, 06:30
@daCypher

Hey ich kann dir, da Arbeit, leider jetzt erstmal nur auf das erste Stückchen antworten.

'TL' or 'tl' nutze ich nur wegen der groß bzw. kleinschreibung. main_input ist etwas, was von etwas größerem stammt, nämlich der Eingabe im Hauptmenü. Das Programm hat aktuell um die 3000 Zeilen oder so (und funktioniert recht gut; main_input ist ausschließlich bei dem Hauptmenü der input; andere Untermenüs haben andere Inputvariablen). Also es ging mir schon darum, wenn eine der beiden Strings da ist, TL groß oder tl klein, gem. Boolscher Algebra.

"if 'TL' or 'tl' in main_input" stimmt was du sagst, das ist eigentlich redundant, denn danach geb ich ja alle Varianten auf die ich meine. Gibt es eine einfache Lösung zu sagen "wenn TL, ob groß oder klein und Kombinationen aus groß und klein" ?

Die Sache ist auch die, dass natürlich es theoretisch möglich ist (sollte ich die Menüführung beispielsweise erweitern durch nachnamensuche), dass ich das ganze dann noch etwas eingrenzen muss.

Aktuell soll folgendes passieren. Gibst du tl mmu an wird aus einer .xlsx nach dem Kürzel eines Mitarbeiter mmu gesucht. Danach werden eben alle Angaben für Max Mustermann (mmu) widergegeben. Später möchte ich das ganze noch auf Nachnamen erweitern. Dann werd ich vermutlich ne SplitFunktion nach Leerzeichen einführen und ein len() um sicher zustellen, dass es keine Fehler gibt.

Ich muss aber sagen das so wie der Code aktuell ist es recht gut funktioniert. Auch ist die Funktion TL [kürzel] nur son kleines minifeature.

found_name_tel war nur da um etwas zu testen; das hatte ich verworfen und dann vergessen raus zu nehmen. Also jetzt ist der Teil nicht mehr drinnen.

Auch die Inputausgabe war ebenfalls nur um zu testen, ob ich die Ausgabe tatsächlich erhalte.

Hmm.. Ich schau mir den zweiten Teil deiner Antwort mal später an :) Danke soweit :)

0
daCypher  26.01.2023, 08:50
@HagbardCeline88

Das mit "if 'TL' or 'tl' in main_input" hast du glaub ich noch nicht so 100%ig verstanden, wie ich es meinte. Ich meinte damit nicht, dass es redundant ist, sondern dass "if 'TL'" immer True ergibt und der Code deshalb auch ausgeführt wird, wenn 'TL' gar nicht in main_input steht.

Wenn du die Eingabe ohne Groß-/Kleinschreibung prüfen willst, kannst du sie einfach komplett in Groß oder Klein umwandeln und dann vergleichen (also z.B. if main_input.upper().startswith("TL ")). Wenn deine Suche mit TL anfangen soll (und TL nicht einfach irgendwo in der Suche stehen soll), kannst du die Funktion startswith("TL ") benutzen.

Bei Vor- und Nachnamen wäre es am Besten, wenn die Namen schon getrennt nach Vor- und Nachname in der Tabelle stehen, sonst hast du bei Doppelnamen manchmal das Problem, dass du nicht so leicht bestimmen kannst, welcher Teil jetzt Vorname und welcher Nachname ist.

0