Python Script - Anfänger

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
TommyKush
User
Beiträge: 1
Registriert: Mittwoch 31. März 2021, 02:00

Hello Python Gemeinde!

Ich bin im Coden in Python ein Anfänger und versuche einige Bash Scripte in Python umzusetzen.

zb. hab ich ein Bash Script für Passwort suche in einer CSV

pwd_search.sh

Code: Alles auswählen

!/bin/bash
if [ "$1" == "" ]; then
        read -p "Welches Passwort suchst du?: " search
echo "*******************"
awk -F"," '{print echo"Seite: "$4, echo"Username/Email: "$8, echo "Passwort: "$9}' pwd.csv | grep "$search"
echo "*******************"
else
echo "*******************"
awk -F"," '{print echo"Seite: "$4, echo"Username/Email: "$8, echo "Passwort: "$9}' pwd.csv | grep "$1"
echo "*******************"
fi
Funktioniert für meine Bedürfnisse gut :)

Code: Alles auswählen

└─# ./pwd_search.sh   
Welches Passwort suchst du?: seite
*******************
Seite: www.seite.at Username/Email: email@email.com Passwort: MeinPasswort123
*******************
                                                                                                                                                                                                               
└─# ./pwd_search.sh seite
*******************
Seite: www.seite.at Username/Email: email@email.com Passwort: MeinPasswort123
*******************

Jetzt wollte ich das ganze in Python umsetzten - leider finde ich nicht das passende - finde nur Ausgaben der gewünschten csv und spalten aber kein search nachdem ich das file eingelesen habe.
Meine Anfänge ...

test.py

Code: Alles auswählen

import pandas as pd
search_input = input('Was suchst du?: ')  
df = pd.read_csv("pwd.csv", sep = ",")
search_output = df.find(search_input)
print(search_output)

Eventuell kann mir jemand auf die Sprünge helfen :)

Vielen Dank, greeez :ugeek:
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

Python bringt das csv-Modul mit:
https://docs.python.org/3/library/csv.h ... module-csv

Schau mal ob du mit der Dokumentation weiter kommst.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TommyKush: Erstmal zum Bash-Skript: Da steht in beiden Zweigen fast das gleiche, das macht man nicht. Das unterscheidet sich ja nur durch den Suchbegriff.

Bei dem AWK-Programm sehe ich den Sinn von den ``echo`` nicht‽

Code: Alles auswählen

#!/bin/bash
if [[ -z "$1" ]]; then
    read -r -p "Welches Passwort suchst du? " pattern
else
    pattern=$1
fi
echo '*******************'
awk -F, '{print "Seite: "$4, "Username/Email: "$8, "Passwort: "$9}' pwd.csv | grep "$pattern"
echo '*******************'
Man kann jetzt auch darüber streiten wie sinnvoll ein ``grep`` auf die Ausgabe inklusive der beschreibenden Texte ist, denn wenn man einen Suchbegriff hat der in der Beschreibung vorkommt, dann werden *alle* Datensätze ausgegeben, auch wenn der Suchbegriff gar nicht in den drei betrachteten Feldern selbst vorkommt.

Pandas ist hier vielleicht ein bisschen overkill.

Das Bash-Skript in Python würde ungefähr so aussehen:

Code: Alles auswählen

#!/usr/bin/env python3
import sys
from subprocess import PIPE, Popen

pattern = (
    sys.argv[1]
    if len(sys.argv) >= 2
    else input("Welches Passwort suchst du? ").strip()
)
print("*" * 19)
awk = Popen(
    [
        "awk",
        "-F,",
        '{print "Seite: "$4, "Username/Email: "$8, "Passwort: "$9}',
        "pwd.csv",
    ],
    stdout=PIPE,
)
grep = Popen(["grep", pattern], stdin=awk.stdout)
grep.wait()
awk.wait()
print("*" * 19)
Dafür würde man natürlich kein Python schreiben weil externe Programme starten und ”zusammenstöpseln” geht mit Bash einfacher, deswegen gibt es solche Shells ja noch.

Da Python auch Zeichenkettenoperationen kann und für reguläre Ausdrücke das `re`-Modul hat, kann man das was ``awk`` und ``grep`` machen, auch in Python nachprogrammieren:

Code: Alles auswählen

#!/usr/bin/env python3
import re
import sys


class Fields:
    def __init__(self, values):
        self.values = values

    def __getitem__(self, index):
        try:
            return self.values[index]
        except IndexError:
            return ""


pattern = (
    sys.argv[1]
    if len(sys.argv) >= 2
    else input("Welches Passwort suchst du? ").strip()
)
print("*" * 19)
try:
    regex = re.compile(pattern)
    with open("pwd.csv") as lines:
        for line in lines:
            fields = Fields(line.rstrip("\n").split(","))
            output_line = (
                f"Seite: {fields[3]}"
                f" Username/Email: {fields[7]}"
                f" Passwort: {fields[8]}"
            )
            if regex.search(output_line):
                print(output_line)
except (re.error, OSError) as error:
    print(error)
print("*" * 19)
Wobei das eher ``egrep`` oder ``grep -E`` entspricht, denn die archaischen POSIX *Basic* Regular Expressions unterstützen Programmiersprachen heute eher nicht mehr.

Und das bildet auch eher unschönes Verhalten von AWK und Bash nach was nicht existierende Felder und Fehlerbehandlung angeht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Grep in Kombination mit AWK ist selten notwendig, denn Pattern-Matching kann AWK schon selbst; das ist ja eines der Kernfeatures:

Code: Alles auswählen

awk -F, "/$pattern/"'{print "Seite: "$4, "Username/Email: "$8, "Passwort: "$9}' pwd.csv
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Weiter weg vom Bash-Skript, aber vielleicht näher an dem was eigentlich gewünscht ist:

Code: Alles auswählen

#!/usr/bin/env python3
import sys
import csv
import re

def main():
    if len(sys.argv) >= 2:
        pattern = sys.argv[1]
    else:
        pattern = input("Welches Passwort suchst du? ")
        
   with open("pwd.csv") as lines:
        rows = csv.reader(lines, delimiter=',')
        for row in rows:
            if len(row) >= 9 and re.search(pattern, row[3]):
                print(f"Seite: {row[3]} Username/Email: {row[7]} Password: {row[8]}")

if __name__ == "__main__":
    main()
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Oder halt direkt ganz in AWK

Code: Alles auswählen

#!/usr/bin/env -S awk -f
BEGIN {
	FS=","
	ARGV[ARGC++] = "pwd.csv"
	if (length(pattern) < 1) {
		printf "Welches passwort suchst du? "
		getline pattern < "-"
	}
}

$1 ~ pattern {
	print "Seite: "$4, "Username/Email: "$8, "Passwort: "$9
}
(Parameterübergabe mit -v pattern=<pattern>)
Antworten