[WinError32] wird von einem anderen Prozess verwendet ?????

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
Kombifahrer
User
Beiträge: 8
Registriert: Montag 5. Mai 2014, 23:16

Hallo,
ich verzweifele gerade, kann mir da jemand weiterhelfen??
aufgabe:
ich lese eine text Datei aus, aus dieser werden einige Daten in einer Liste gespeichert,
wenn die Daten aus dieser Liste in einem speziellen Verzeichnis vorhanden sind,
möchte ich gerne die Text verschieben!!
auslesen und finden funktionieren!
aber beim verschieben kommt folgende Fehlermeldung, was mich irritiert ist das das Ziel Verzeichnis angezeigt wird!!


Traceback (most recent call last):
File "C:\Python33\pallete.py", line 47, in <module>
os.rename(paletten_verz+dat,verz_versch+dat)
PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird:
:K 'C:/ Zielverzeichnis / Datei '

Code: Alles auswählen

for dat in os.listdir(paletten_verz):
	if dat.endswith('.palette'):
		if dat.startswith('PS_VK') or dat.startswith('PS_E') or dat.startswith('PS_F'):
			o=open(paletten_verz+'/'+dat)
			line=o.readlines()
			o.close
			loeschen=[]
			for i in line:
				if 'charge_nr = ' in i:
					ch = i.split('=')[1]
					ch=ch.replace('\n','')
					ch=ch.replace(' ','')
				if 'gravur = ' in i:
					nest = i.split('=')[1]
					nest = nest.replace('\n','')
					nest=nest.replace(' ','')
					if nest!='' and ch!='':
						charge=ch
						nestb=nest
						pdf=charge+'_'+nestb
						loeschen.append(pdf)		
			print(loeschen)
			anz=(len(loeschen))
			anzp=0
			for chnest in loeschen:
				print (chnest)
				for pdf in os.listdir(verz_pdf):
					if chnest in pdf:
						anzp=anzp+1
			print('anzahl ',anz,' liste')
			print('anzahl in pdf ',anzp,)
			print(dat)
			if anzp==anz:			
				os.rename(paletten_verz+dat,verz_versch+dat)
BlackJack

@Kombifahrer: Kann es eventuell damit zusammenhängen, dass Du die Datei aus Zeile 4 in Zeile 6 nicht wieder schliesst? Du musst die `close()`-Methode auch *aufrufen*. Einfach nur referenzieren hat keinen Effekt. An der Stelle kannst Du aber sowieso darüber nachdenken die Datei mit der ``with``-Anweisung zusammen zu öffnen und damit das schliessen automatisch und robuster zu bekommen.

Ich würde die Datei auch nicht komplett einlesen, man kann mit ``for`` zeilenweise über das Dateiobjekt iterieren.

Das was Du `line` nennst enthält mehr als eine Zeile, sollte also `lines` heissen. Dann könnte man in der Schleife `i` nämlich `line` nennen. `i` an etwas anderes als ganze Zahlen zu binden, insbesondere in einer Schleife, ist gar keine gute Idee. So ziemlich jeder Programmierer dürfte das sehr überraschend finden.
Kombifahrer
User
Beiträge: 8
Registriert: Montag 5. Mai 2014, 23:16

BlackJack hat geschrieben:@Kombifahrer: Kann es eventuell damit zusammenhängen, dass Du die Datei aus Zeile 4 in Zeile 6 nicht wieder schliesst? Du musst die `close()`-Methode auch *aufrufen*. Einfach nur referenzieren hat keinen Effekt. An der Stelle kannst Du aber sowieso darüber nachdenken die Datei mit der ``with``-Anweisung zusammen zu öffnen und damit das schliessen automatisch und robuster zu bekommen.

Ich würde die Datei auch nicht komplett einlesen, man kann mit ``for`` zeilenweise über das Dateiobjekt iterieren.

Das was Du `line` nennst enthält mehr als eine Zeile, sollte also `lines` heissen. Dann könnte man in der Schleife `i` nämlich `line` nennen. `i` an etwas anderes als ganze Zahlen zu binden, insbesondere in einer Schleife, ist gar keine gute Idee. So ziemlich jeder Programmierer dürfte das sehr überraschend finden.
:oops: :oops: ohhh mannnn 'o.close ()', diese blöde klammer!!!!!! :evil: :oops: :oops:

Ich Danke dir BlackJack
BlackJack

Kombifahrer: Noch ein paar Anmerkungen:

Die Einrückung ist per Konvention vier Leerzeichen pro Ebene.

Um das ``=`` bei Zusweisungen (ausserhalb von Argumentlisten) und binären Operatoren machen Leerzeichen das ganze lesbarer. Das gleiche gilt für ein Leerzeichen nach Kommas.

Abkürzungen bei Namen sollte man vermeiden solange sie nicht allgemein bekannt sind. Namen sollen das Programm verständlich(er) machen und den Leser nicht zum Rästelraten zwingen.

Die beiden ersten ``if``\s in der äusseren Schleife kann man zusammenfassen. `str.startswith()` kann man auch ein Tupel mit mehreren Testzeichenketten übergeben.

Pfade setzt man besser mit `os.path.join()` anstatt ``+`` zusammen.

Beim Verarbeiten der Zeilen aus einer Datei werden teilweise nichtssagende Namen verwendet und zwei die überhaupt nicht nötig sind: `charge` und `nestb`. Die Zuweisung hätte man sich sparen können. Die Verarbeitung der beiden Zeilen nach denen gesucht wird hätte man auch kompakter ausdrücken können. Ist Leerzeichen ersetzen tatsächlich nötig, oder hätte es hier auch `strip()` getan?

`anz` und `anzp` sind schlechte Namen — Abkürzung und wenn man "Anzahl" erraten hat, weiss man immer noch nicht um welche Anzahl es geht.

Die Reihenfolge bei den Schleifen die testen ob die `loeschen`-Elemente in den Dateinamen enthalten sind, ist sehr wahrscheinlich ungünstig. Statt die Liste einmal zu durchlaufen und die Dateinamen für jedes Element mit `os.listdir()` erneut in eine Liste zu lesen, wäre es wahrscheinlich effizienter es umgekehrt zu machen. Ausserdem vermute ich ganz stark, dass man beim ersten Treffer aufhören kann mit der inneren Schleife, oder kann ein Element aus `loeschen` in mehr als einem Dateinamen vorkommen? Falls nein, kann man aus `loeschen` auch eine Menge (`set`) machen und bei einem Treffer das Element löschen. Damit spart man sich unnötige Tests. Und braucht auch keine Zähler mehr, denn die Bedingung zum Verschieben wäre genau dann erfüllt wenn die Menge am Ende leer ist weil zu jedem Element ein Dateiname gefunden wurde.

Unter den zuletzt gemachten Annahmen komme ich dann ungefähr auf so etwas (ungetestet):

Code: Alles auswählen

def extract_value(line):
    return line.split('=')[1].strip().replace(' ', '')


def main():
    
    # ...

    for dateiname in os.listdir(paletten_verzeichnis):
        if (
            dateiname.endswith('.palette')
            and dateiname.startswith(('PS_VK', 'PS_E', 'PS_F'))
        ):
            with open(os.path.join(paletten_verzeichnis, dateiname)) as lines:
                charge_nests = set()
                for line in lines:
                    if 'charge_nr = ' in line:
                        charge = extract_value(line)
                    if 'gravur = ' in line:
                        nest = extract_value(line)
                        if charge and nest:
                            charge_nests.add(charge + '_' + nest)
            print(sorted(charge_nests))

            for pdf_dateiname in os.listdir(pdf_verzeichnis):
                for charge_nest in charge_nests:
                    if charge_nest in pdf_dateiname:
                        charge_nests.remove(charge_nest)
                        break
            print(sorted(charge_nests))
            
            print(dateiname)
            if not charge_nests:
                os.rename(
                    os.path.join()(paletten_verzeichnis, dateiname),
                    os.path.join()(archiv_verzeichnis, dateiname)
                )
Je nach dem wie viele Dateinamen im PDF-Verzeichnis sind, kann es auch günstiger sein jedes `charge_nests`-Element sofort zu überprüfen und die Verarbeitung einer ``.palette``-Datei abzubrechen sobald man ein Element gefunden hat, zu dem es keine PDF-Datei gibt.
Antworten