Anfänger ausgabe in Liste erstellen

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
WasabiSamurai
User
Beiträge: 7
Registriert: Mittwoch 4. April 2018, 11:06

Hallo,
Ich hatte am Wochenende eine Idee, die ich gerne umsetzen möchte und das in verbindung mit dem erlernen einen neuen Programiersprache.

erstmal das was ich bis jetzt habe.

Code: Alles auswählen

# Test Projekt: MD5 DATABASE
# Film und Serien Daten anhand von MD5 Summen ermitteln

# dateien suchen
extensions = set(['.mkv','.nfo'])
import os
for subdir, dirs, files in os.walk("/home/wasabisamurai"):
    for file in files:
        if file.endswith(tuple(extensions)):
           test1 = (os.path.join(subdir, file))
           dateiliste = [test1]
           #dateiliste.append[test1]
           print dateiliste
           
# dateien hashen
import hashlib
filehash = hashlib.md5()

for x in dateiliste:
    print (x)
    filehash.update(open(x).read())
    print x + ' ' + filehash.hexdigest()


# Api abfrage Film Datenbank ( Filme )



# Api abfrage Filn Datenbank ( Serien )


# Abfrage MD5 Datenbank abgleich mit MD5 summe
## -- wenn MD5 schon werte eintragen
## -- wenn keine werte vorhanden, werte editieren anhand API abfragen


# Werte mit KODI abgleichen
## -- DB Analyse (Achtung mehrere Schemas)


# Pfade anononymisieren nur Dateinamen übrig lassen
## -- String maniplulation


# Dateinamen, MD5, FILMID, SERIENID, SESSIONID, EPISODENID an Datenbank senden
## -- Wichtig anonyme Methode finden (Schutz für User/Supporter) 



Momentan hänge ich dadran fest, die Ausgabe von test1 = (os.path.join(subdir, file)) in eine Liste umzuleiten,
damit ich die Liste mit filehash.update(open(x).read())
print x + ' ' + filehash.hexdigest()


weiter bearbeiten kann.

Ich hoffe mir kann jemand bei meinen Anfängerfragen weiterfelfen.

mfg WasabiSamurai
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@WasabiSamurai: was stört Dich denn am `append`?

Warum ist `extensions` ein Set, wo Du doch eigentlich ein Tuple brauchst? Oder warum benutzt Du `file.endswith`, wo doch der Vergleich von `os.path.splitext(file)[0] in extensions` viel besser mit einem Set funktioniert.

Warum, wenn Du Python neu lernst, nimmst Du das nicht mehr ganz aktuelle Python2 statt Python3?
WasabiSamurai
User
Beiträge: 7
Registriert: Mittwoch 4. April 2018, 11:06

@Sirus3
das mit dem append hat merkwürdiger weise nicht funktioniert. Hab mir tutorials dazu angesehen wo es so beschrieben worden ist, hab es dann getestet aber ich habe bestimmt irgendwas falsch gemacht.
Die Python varriante kommt von meinem Linux Mint.

Wie geschrieben, ich fang gerade erst an. Ich suche nach Code schnippseln die für mich verständlich sind ( Habe bisher nur BASH und BATCH Scripte geschrieben ) und versuche anhand dessen mir Python beizubringen.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@WasabiSamurai: wie sah denn die Variante mit `append` aus und was genau hat nicht funktioniert?
WasabiSamurai
User
Beiträge: 7
Registriert: Mittwoch 4. April 2018, 11:06

@Sirus3
https://python-kurs.eu/python3_listen.php

Code: Alles auswählen

>>> l = [42,98,77]
>>> l.append(103)
>>> l
[42, 98, 77, 103]
um python3 zubenutzen mus ich das script nur mit python3 test.py starten funktioniert dann aber auch nicht.
bekomme bei abfrage der Variable nicht das geünschte ergebnis.
ergebnis momentan

Code: Alles auswählen

['PFAD/DAteiname']
['PFAD/DAteiname']
['PFAD/DAteiname']
und nicht

Code: Alles auswählen

['PFAD/DAteiname', 'PFAD/DAteiname','PFAD/DAteiname']
:K

Code: Alles auswählen

# dateien suchen
extensions = set(['.mkv','.nfo'])
import os
for subdir, dirs, files in os.walk("/home/wasabisamurai"):
    for file in files:
        if file.endswith(tuple(extensions)):
           test1 = (os.path.join(subdir, file))
           dateiliste = []
           dateiliste.append(test1)
           print(dateiliste)
           
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

WasabiSamurai hat geschrieben:@Sirus3
Ich suche nach Code schnippseln die für mich verständlich sind und versuche anhand dessen mir Python beizubringen.
Code von Anderen lesen und verstehen, finde ich eine gute Idee, hat mir auch beim Lernen geholfen.

Was man nicht machen sollte, ist Code von mehreren Anderen kopieren, zusammenstückeln, ohne wirklich die Funktionsweise zu verstehen, dann verhaspelt man sich schnell, und sollte lieber eine gute Anleitung lesen, bspw. das offizielle Python Tutorial. :mrgreen:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@WasabiSamurai: die Beiträge von python-kurs.eu sind wirklich schlecht und sollten nicht zum Lernen benutzt werden.

Du erzeugst bei jedem Schleifendurchgang eine neue Liste. Klar, dass da dann immer nur ein Element drin ist.
WasabiSamurai
User
Beiträge: 7
Registriert: Mittwoch 4. April 2018, 11:06

@Sirius3
ha ha, krass stimmt, wenn man in der schleife die Variable immer wieder neu setzt, wird sich der wert nicht ändern. :lol:

Code: Alles auswählen

# dateien suchen
dateiliste = []
extensions = set(['.mkv','.nfo'])
import os
for subdir, dirs, files in os.walk("/home/wasabisamurai"):
    for file in files:
        if file.endswith(tuple(extensions)):
           test1 = (os.path.join(subdir, file))
           dateiliste.append(test1)
print(dateiliste)
Funktioniert jetzt :D .
Danke
WasabiSamurai
User
Beiträge: 7
Registriert: Mittwoch 4. April 2018, 11:06

Und hier mit Funktionierenden und nicht VM ( 2GB ) lahmlegenden Hashfunktion :D

Code: Alles auswählen

# Test Projekt: MD5 DATABASE
# Film und Serien Daten anhand von MD5 Summen ermitteln

# dateien suchen
dateiliste = []
extensions = set(['.mkv','.nfo'])
import os
for subdir, dirs, files in os.walk("/home/wasabisamurai"):
    for file in files:
        if file.endswith(tuple(extensions)):
           test1 = (os.path.join(subdir, file))
           dateiliste.append(test1)
print(dateiliste)

# dateien hashen
for x in dateiliste:
    import hashlib
    BLOCKSIZE = 65536
    hasher = hashlib.md5()
    with open(x, 'rb') as afile:
        buf = afile.read(BLOCKSIZE)
        while len(buf) > 0:
            hasher.update(buf)
            buf = afile.read(BLOCKSIZE)
    print (x) + ' ' + (hasher.hexdigest())
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@WasabiSamurai: noch ein paar Tipps für gute Struktur: Importe stehen immer ganz am Anfang der Datei, damit man auf einen Blick die Abhängigkeiten sehen kann. `test1` ist ein nichtssagender Variablenname, Variablennamen sollten immer Aussagekräftig sein, damit man das Programm auch noch nach zwei Tagen versteht. Ebenso `x`. Gute Variablennamen helfen schon beim Schreiben dem Verständnis, weil, wenn man einer Variable keinen guten Namen geben kann, weiß man auch nicht genau, was man eigentlich damit machen will. Wer `afile` sagt, muß auch `bfile` sagen. Datentypen packt man nicht in Variablennamen, z.B. könnte es irgendwann statt einer Liste etwas anderes Iterierbares zu nehmen, und dann passt entweder der Variablenname `dateiliste` nicht mehr, oder man müßte überall die Variable umbenennen. Einfach den Inhalt als Plural nehmen: `movie_filenames`. Man sollte Code-Wiederholungen vermeiden. Deshalb sieht man oft while-True-Schleifen, die dann, wenn die Eingangsbedingung nicht mehr erfüllt ist, per `break` verlassen wird. Statt Code-Blöcke mit Kommentaren zu strukturieren, nimmt man am besten Funktionen. Die sind genauso aussagekräftig, aber flexibler einsetzbar.

Code: Alles auswählen

# Test Projekt: MD5 DATABASE
# Film und Serien Daten anhand von MD5 Summen ermitteln
from __future__ import print_function
import os
import hashlib

EXTENSIONS = set(['.mkv','.nfo'])
BLOCKSIZE = 65536

def search_files(basedir):
	movie_filenames = []
	for subdir, dirs, filenames in os.walk(basedir):
		for filename in filenames:
			if os.path.splitext(filename)[1] in extensions:
			   movie_filenames.append(os.path.join(subdir, filename))
	print(movie_filenames)
	return movie_filenames

def hash_files(filenames):
	for filename in filenames:
		hasher = hashlib.md5()
		with open(filename, 'rb') as data:
			while True:
				buf = data.read(BLOCKSIZE)
				if not buf:
					break
				hasher.update(buf)
		print("{} {}".format(filename, hasher.hexdigest()))
		
def main():
	movie_filenames = search_files("/home/wasabisamurai")
	hash_files(movie_filenames)
	
if __name__ == '__main__':
    main()
WasabiSamurai
User
Beiträge: 7
Registriert: Mittwoch 4. April 2018, 11:06

@Sirius3

Danke für das Beispiel.
Ich mußte zwar zeile 3 Auskommentieren from __future__ import print_function
und habe festgestellt das man auf Groß und Kleinschreibung bei den Variablen achten muß EXTENSIONS.

Aber jetzt läuft es auf Python2 und Python3, Danke.

Jetzt bin ich nur nach am grübeln wie search_files("/home/wasabisamurai") zu search_files(basedir) wird.

def search_files(basedir): # erstellt die Funktion mit "Eingabe für Variablen"

search_files("/home/wasabisamurai") # übergibt den wert

habe ich mir das richtig zusammen gereimt ?

und print ("{} {}". bin ich auch am überlegen was die beiden geschweiften Klammern bedeuten.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, Funktionen haben Argumente, Du benutzt ja auch schon etliche Funktionen mit Argumenten. Und die geschweiften Klammern sind Formatierungsplatzhalter.
WasabiSamurai
User
Beiträge: 7
Registriert: Mittwoch 4. April 2018, 11:06

@Sirius3
Ahhh ok. Danke.
Antworten