[Python]Bombers Fragetread

soares schrieb:
Überlegen, welche Möglichkeiten Du hast und die naheliegende auswählen?

Wenn wir Dir hier alles vorkauen, ist der Erkenntnisgewinn geringer, als wenn Du selbst auf eine Lösung kommst. Es ist bei dem Problem nicht so, als ob Du auf einen völlig neuen Dreh kommen müsstest.

Ich versteh dich ja. Das Problem ist, dass man eine Programmiersprache normalerweise mit einem Lehrer lernt. Man lernt neue Funktionen und bekommt dann Aufgaben, in denen man sie anwenden muss.

Hier habe ich den Code etwas überarbeitet und i als Parameter eingefügt.
Code:
def dateien(pfad, i):
	for name1 in os.listdir(pfad):
		j=str(i)
		name= pfad + name1
		if os.path.isfile(name):
			os.rename(name, pfad + j + os.path.splitext(name)[1])
			print (name+" wurde umbenannt.")
			i = i + 1
		elif os.path.isdir(name):
			print("Durchsuche Ordner " + name1)
			dateien(pfad+name1+"/", i)
		else: print (name+ " konnte nicht umbenannt werden")
	print ("Umbenennen erfolgreich")
Ich verstehe auch warum es nicht klappt. Ich überlege bloß immer noch, wie ich es machen könnte, dass der Parameter i beim Abschluss einer Funktion erhalten bleibt. Wenn z.B. i=3 ist, wenn alle dateien umbenannt sind, und ich in einen neuen Ordner gehe, ist i anfangs immer noch 3 und wird dann im Ordner erhöht. Wenn dieser Ordner allerdings durch ist, geht er wieder in den Hauptordner, wo i=3 ist und von dort zum nächsten Ordner. Ich bräuchte also Idee, um einen Parameter zu speichern o.ä. .
 
Wenn i immer weitergezaehlt werden soll, musst du dafuer sorgen, dass es bei jedem erneuten Aufruf der Funktion schon den jeweils richtigen Wert hat. Stichwort Akkumulator.

Edit: Habe deinen Post in der Zwischenzeit uebersehen. Eigentlich hast du doch die Loesung schon vor Augen. Du musst jetzt eben dafuer sorgen, dass das neue i auch erhalten bleibt, wenn die Funktion fertig ist. Du brauchst sozusagen das Ergebnis der Funktion.
 
Zuletzt bearbeitet:
Ein Konzept, das in diesem Thread ebenfalls bereits aufgetaucht ist. Ich habe das entsprechende Code-Beispiel nicht ohne Grund anders gewählt als Yuuri...
 
Das Ergebnis der Funktion. Das habe ich auch probiert. Unter anderem mit Return. Die Zeile sah dann so aus:
Code:
			dateien(pfad+name1+"/", i + return dateien(pfad+name1+"/", i )
Das ist aber irgendwie auch nicht das wahre...
 
Der Code ist auch schon syntaktisch Unsinn. Schau dir erstmal an wie (und vor allem wo) man return verwendet. Das ist eigentlich in jeder Sprache gleich.
 
Zuletzt bearbeitet:
Aber der Ansatz mit return ist schon richtig. Willst Du den Index-Wert in der Funktion mitschleppen, musst Du den aktuellen Wert auch immer zurück geben - und dann weiter verarbeiten.
 
Ich verstehs nicht...
Dieses Return....
Als Beispiel. Ich hab meine Funktion:
Code:
def dateien(pfad,i):
	for name1 in os.listdir(pfad):
		j=str(i)
		name= pfad + name1
		if os.path.isfile(name):
			os.rename(name, pfad + j + os.path.splitext(name)[1])
			print (name+" wurde umbenannt.")
			i = i + 1
		elif os.path.isdir(name):
			print("Durchsuche Ordner " + name1)
			dateien(pfad+name1+"/",i)
		else: print (name+ " konnte nicht umbenannt werden")
	return i
	print ("Umbennenen erfolgreich")
wenn jetzt, der letzte Unterordner, also 1.1.1 erreicht ist, müsste doch das i in der Funktion endgültig 9 werden. Stattdessen kehrt er aber in Ordner 1.1. zurück, wo i=6 ist und übernimmt diesen wert in Unterordner 1.1.2...

Mal eine Frage: Ich habe jetzt den Wert für i mit Return zurückgegeben. Wie kann ich diese Zurückgabe weiter verarbeiten?...
 
Es fehlt eine Kleinigkeit: Den Wert, den der rekursive Aufruf liefert, ignorierst Du.
 
Wie wäre es mal mit einem einfachen Beispiel?

Code:
def add(x, y):
    z = x + y

result = add(1, 2)
print(result)

Was wird ausgegeben?

Code:
def add(x, y):
    z = x + y
    return z

result = add(1, 2)
print(result)

Was wird jetzt ausgegeben?

Damit sollte dann auch klar sein, wie du die Rückgabe weiterverarbeiten (hier: ausgeben) kannst.
 
Zuletzt bearbeitet:
Sorry, ich verstehs immer noch nicht... Ich denke, ich steh mal wieder voll auf dem Schlauch...
Wie siehts damit aus? :

ICH HABS!... So sieht der Code aus...
Code:
def dateien(pfad,i=1):
	for name1 in os.listdir(pfad):
		j=str(i)
		name = pfad + name1
		if os.path.isfile(name):
			os.rename(name, pfad + j + os.path.splitext(name)[1])
			print (name+" wurde umbenannt.")
			i = i + 1
		elif os.path.isdir(name):
			print("Durchsuche Ordner " + name1)
			i = dateien(pfad+name1+"/",i)
		else: print (name+ " konnte nicht umbenannt werden")
	print ("Umbenennen erfolgreich")
	return i

Aufgabe durch mehr oder weniger probieren gelöst....
 
Zuletzt bearbeitet:
Dann solltest du jetzt unbedingt am Stil arbeiten. Ich denke da vor allem an die Benennungen, denn was eine Methode namens "dateien" macht, wüsste ich nicht, ohne mich in den Code einzulesen.
 
Klar ;)
In letzter Zeit werden meine Variablen immer mehr MischMasch... Also dort mal ne englische, dort ne deutsche. Aber ich denke das wird...

Man bin ich froh, dass das jetzt läuft... Ich hatte hier nen richtigen Nervenzusammenbruch :/
 
Gut, ich habe den Code ein bisschen überarbeitet und ein paar Zeilen eingefügt, so dass in jedem Ordner nur 100 Dateien sind, wenn diese erreicht sind, sollen sie in den nächsten Ordner im gleichen Verzeichnis kopiert werden usw. Wenn kein Ordner mehr da ist, soll ein neuer Ordner erstellt werden, in den es dann rein verschoben wird. Hier der Code:

Code:
def pic_rename(path,i=1,number=[]):
	a = 0
	shutil.move(number,path)
	for name1 in os.listdir(path):
		j=str(i)
		name = path + name1
		if os.path.isfile(name):
			a = a + 1
			if (a>100): number.append(name)
			else:
				name_after_rename=os.rename(name, path +"picture "+ j + os.path.splitext(name)[1])
				i = i + 1
		elif os.path.isdir(name):
			print("Durchsuche Ordner " + name1)
			i = pic_rename(path+name1+"/",i,number)
		else: print (name+ " konnte nicht umbenannt werden")
	return i
Probleme: shutil ist nicht definiert? Muss ich irgendwie shutil erst importieren?
Die Sache mit dem neuen Ordner erstellen habe ich noch nicht geschafft, die ist also im Quellcode noch nicht drin. Im Moment soll erstmal alles aus der number liste in den letzten Ordner kopiert werden.
 
Könnt ihr was mit diesem error anfangen:

Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
pic_rename(path,i=1,number=[])
File "<pyshell#5>", line 3, in pic_rename
shutil.move(number,path)
File "D:\Programme\Python3\lib\shutil.py", line 320, in move
real_dst = os.path.join(dst, _basename(src))
File "D:\Programme\Python3\lib\shutil.py", line 293, in _basename
return os.path.basename(path.rstrip(os.path.sep))
AttributeError: 'list' object has no attribute 'rstrip'

Bei genau diesem Programm...
 
Du rufst shutil.move mit einem ungültigen Argument auf. Diese Funktion erwartet eine Datei oder ein Verzeichnis als Quell- und Zielargument.
 
Gut. Also, ich habs jetzt einigermaßen geschafft. Leider ist immer noch ein kleiner Fehler dabei. Es läuft zwar durch, aber die Dateien werden nicht verschoben.
Als BSP: im Ordner 1 sind 100 Dateien, im Ordner 2 160 und im Ordner 3 20.
Jetzt benennt er aber nur die 100 im 1., die 100 ersten im 2. und die 20 im 3 Ordner um. Die anderen werden gar nicht beachtet.

Findet ihr eventuell den Fehler?:

Code:
def pic_rename(path,i=1,number=[]):
	a=0
	for move_file in number:
		shutil.move(move_file,path)
	number=[]
	for file_name in os.listdir(path):
		j=str(i)
		path_name = path + file_name
		[B]if os.path.isfile(path_name):
			a=a+1
			if a > 100:
				number.append(path_name)
			else:
				os.rename(path_name, path +"pictureb "+ j + [/B]os.path.splitext(path_name)[1])
				i = i + 1
		elif os.path.isdir(path_name):
			print("Durchsuche Ordner " + file_name)
			print(number)
			i = pic_rename(path+file_name+"/",i,number)
		else: print (path_name+ " konnte nicht umbenannt werden")
	return i

Wahrscheinlich liegt das Problem in der oben Fett markierten if anweisung...
 
Du hast explizit eine Abfrage für die Dateien drin und lässt nur die ersten 100 umbenennen. Wenn das nicht gewollt ist, nimm die Abfrage raus!? Schwierig, sich in die Gedankengänge eines Novizen hinein zu versetzen :)
 
Novize... :D das klingt schon fast nach nem Spiel

Also, ich will die ersten 100Dateien in einem Ordner umbenennen und die anderen in den nächsten Ordner verschieben. Dort wieder die ersten 100. umbenennen und so weiter... Aber das mit dem Verschieben haut nicht ganz hin ;)
 
BomberDeluxe schrieb:
Also, ich will die ersten 100Dateien in einem Ordner umbenennen und die anderen in den nächsten Ordner verschieben. Dort wieder die ersten 100. umbenennen und so weiter... Aber das mit dem Verschieben haut nicht ganz hin ;)

Du hast noch Schwierigkeiten damit, Dir die Verarbeitung vorzustellen. Lege Dir ein Verzeichnis mit nur wenigen Dateien an, ändere den Threshold-Wert für das Umbenennen (auf z.B. 1) und gehe das Ganze mit einem Debugger durch.

Du speicherst die Dateien, die nicht umbenannt werden sollen, in (einer schlecht benannten) Variablen zur späteren Verarbeitung. Aber Du machst nichts damit. Wenn Dateien in einen neuen Unterordner geschoben werden sollen, musst Du diesen zuerst erstellen und dann die Verarbeitung entsprechend anstoßen.

Aber sollen die Verzeichnisse wirklich immer weiter verschachtelt werden?
HTML:
image001.jpg
images
  image002.jpg
  images
    image003.jpg
    images
      image004.jpg
 
Zurück
Oben