Seite 1 von 1

Python Script - Anfänger

Verfasst: Mittwoch 31. März 2021, 03:04
von TommyKush
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:

Re: Python Script - Anfänger

Verfasst: Mittwoch 31. März 2021, 11:05
von Dennis89
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

Re: Python Script - Anfänger

Verfasst: Mittwoch 31. März 2021, 11:16
von __blackjack__
@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.

Re: Python Script - Anfänger

Verfasst: Mittwoch 31. März 2021, 12:43
von nezzcarth
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

Re: Python Script - Anfänger

Verfasst: Mittwoch 31. März 2021, 14:15
von Sirius3
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()

Re: Python Script - Anfänger

Verfasst: Mittwoch 31. März 2021, 21:11
von nezzcarth
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>)