umfangreiches Skript

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
jp.soehn
User
Beiträge: 3
Registriert: Mittwoch 2. September 2009, 13:22

Hallo,
ich habe ein recht umfangreiches Python-Skript, was aber sehr simpel aufgebaut ist. Folgender try-except-Block wird wiederholt, um eine große Menge Dateien umzubenennen:

try:
os.rename("blabla.ext", "blablabla.ext")
except WindowsError:
print "Datei nicht vorhanden"

Das Skript hat 71.110 Zeilen und wird ohne Fehlermeldung einfach nicht ausgeführt (Der Prompt im cmd-Fenster - Windows XP - erscheint wieder und nicht ist passiert). Bei nur 5 try-except-Blöcken funktioniert es einwandfrei.
Was mache ich also bei einem so großen Skript? Kann ich irgendwie mehr Speicher allozieren oder gibt es eine andere Lösung?
Übrigens habe ich Python 2.5.

Vielen Dank schonmal für Eure Hilfe!!!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Entschuldige, aber mit den Angaben kann man dir nicht helfen. So wies aussieht, startest du das Skript per Doppelklick? Wenn ja, fuehre es mal auf der Kommandozeile aus, dann solltest du den Traceback auch sehen, wenn es denn einen gibt.
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Wieso löst du das ganze nicht mit ner Schleife? Die Dateinamen kannst du ja unter Umständen vorher in eine Liste packen...
jp.soehn
User
Beiträge: 3
Registriert: Mittwoch 2. September 2009, 13:22

Ich starte das Skript per Kommandozeile. Es gibt keinen Traceback, sondern es erscheint einfach wieder ein Prompt, so wie nach einem korrekt ausgeführten Skript. Leider wurde aber keine einzige Umbenennung vorgenommen.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo und willkommen im Forum,

Du schreibst Skripte mit 71-Tausend Zeilen??? Meine Güte, das ist kein Skript mehr, das ist eine riesige Software(bibliothek?)!

Ansonsten: Wie kommst Du darauf, dass Du mehr Speicher brauchst? Fängt der Rechner an zu swappen (bzw. auf Windows: in die "Auslagerungsdatei" zu schreiben)? Mit den gemachten Angaben kann man nur raten, aber ich würde raten: Dein Skript braucht dringend ein Refactoring.

Und: Mit so wenig Code und der Aussage "wird ohne Fehlermeldung einfach nicht ausgeführt", kann man wenig dazu sagen. So viel kann man hier nicht posten, aber kannst Du ein Minimalbeispiel posten? Ggf. auch in einem Pastebin? Ein Minimalbeispiel wäre ohnehin ein guter erster Schritt den Fehler zu identifizieren. (Kommt das Skript z.B. überhaupt an der fraglichen Stelle an?)

Gruß,
Christian
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

17777 Dateien mit 17777 aneinandergereihten 4-Zeilern umbenennen zu wollen ist kein "umfangreiches Skript" sondern Wahnsinn - IMHO.

Ich könnte mir vorstellen, dass die 71110 Zeilen irgendwie Pythons Grenzen sprengen, was Bytecode angeht. Ich würde vorschlagen, die Datei in 4 Teile mit je 4444 Umbenenn-Operationen zu zerteilen und es dann noch mal zu versuchen.

Geht das immer noch nicht, ganz am Anfang "import pdb; pdb.set_trace()" eingeben und debuggen, wo das ganze abbricht. Mehr gibt meine Kristallkugel nicht her.

Stefan
jp.soehn
User
Beiträge: 3
Registriert: Mittwoch 2. September 2009, 13:22

Erstmal vielen Dank.

@sma: aufsplitten hatte ich schon probiert - ohne Erfolg

@cm: mein Bsp. war schon ein Minimalbeispiel, weil es nur solche try-except-blöcke gab und nichts weiter.

@bankkind: Danke! Der Tipp liegt auf der Hand, aber das war genau das, was ich brauchte. Die Liste mit den Dateinamen gab es ja schon.
Mein neues, funktionierendes Skript:

Code: Alles auswählen

import re,sys,os,os.path,string

input = open("dateinamenliste.txt", "r")

for line in input.xreadlines():
	filename = line.rstrip('\n')
	print filename
	newname = "nichtbas"+filename
	print newname
	try:
	 	os.rename(filename, newname)
	except WindowsError:
		print "Datei nicht vorhanden"

input.close()
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Warum dann nicht

Code: Alles auswählen

with open("dateinamenliste.txt") as liste:
    for name in liste:
        if os.path.exists(name):
            os.rename(name, "nichtbas" + name)
        else:
            print name, "nicht vorhanden"
Stefan
lunar

@sma: Die Zeilenumbrüche müssen entfernt werden, außerdem sollte man lieber Ausnahmen abfangen anstatt vorneweg zu testen:

Code: Alles auswählen

with open('namesliste.txt') as stream:
    for line in stream:
        name = line.rstrip('\n')
        new_name('nichtbas' + name)
        print('{0} -> {1}'.format(name, new_name)
        try:
            os.rename(name, new_name)
        except EnvironmentError as error:
            print(error)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

sma hat geschrieben:17777 Dateien mit 17777 aneinandergereihten 4-Zeilern umbenennen zu wollen ist kein "umfangreiches Skript" sondern Wahnsinn - IMHO.
Oh, SO ist das aufzufassen? :shock:
Antworten