Python python 3 os.rename WinError 32, datei wir von einem anderen Prozess genutzt

e_Lap

Commander
Registriert
Apr. 2013
Beiträge
2.182
Moin, habe folgendes Script geschrieben:

Code:
from PIL import Image
from PIL.ExifTags import TAGS
import os

path = "./_assets/"
file = open("test.txt", 'w', newline="\r\n")
name_offset = "xxx"
file_type_offset = ".JPG"


source = r'.\_assets'


def get_exif(fn):
    ret = {}
    i = Image.open(fn)
    info = i._getexif()
    for tag, value in info.items():
        decoded = TAGS.get(tag, tag)
        ret[decoded] = value
    i.close()
    return ret


exif_data_list = {}

for img in os.listdir(path):

    path2 = r'C:\Users\lnerlich\PycharmProjects\Test01\imagetesting\_assets' + '\\' + img
    img_cache = {}
    img_cache.update(get_exif(path + img))

    if img_cache.get('UserComment'):
        del img_cache['UserComment']

    if img_cache.get('MakerNote'):
        del img_cache['MakerNote']

    file.write(img)
    file.write("\n")
    for keyX, valueX in img_cache.items():
        file.write(keyX)
        file.write(": ")
        file.write(str(valueX))
        file.write("\n")
    file.write("\n")

    exif_data_list.update(img_cache)

    datetime = img_cache['DateTime']
    datetime_new = datetime.replace(':', '-')
    datetime_new = datetime_new.replace(' ', '_')

    os.rename(path2, path2 + '\\' + datetime_new + file_type_offset)

file.close()

ich lese Bilder im Ordner _assets ein und speichere deren EXIF Dateien in einer txt Datei.
Das klappt auch alles.
Gerne würde cih die Bilder jetzt nach dem DateTime Tag umbennenen.
Doch hier kriege ich jedesmal:

PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'C:\\Users\\xx\\PycharmProjects\\Test01\\imagetesting\\_assets\\IMG_3472.jpg' -> 'C:\\Users\\xx\\PycharmProjects\\Test01\\imagetesting\\_assets\\IMG_3472.jpg\\2014-08-20_18-20-07.JPG'

Hat da jemand ne Ahnung?
Danke im Vorraus!
 
Zuletzt bearbeitet:
Sieh nach wer oder was die Datei(en) offen hält. Mein Verdacht ist, es ist dein Python Programm selber irgendwo.
Process Explorer kann es dir anzeigen wenn du willst.
 
Bis auf Zeile 8 könnte ich es mir nicht erklären. Ob Zeile 13. da einen Einfluss drauf hat, weiß ich nicht.
Process Explorer habe ich überprüft.
 
e_Lap schrieb:
Bis auf Zeile 8 könnte ich es mir nicht erklären. Ob Zeile 13. da einen Einfluss drauf hat, weiß ich nicht.
Process Explorer habe ich überprüft.

In Zeile 8 weist du einer Variablen einen String zu. In Zeile 13 ist nur Whitespace. Wovon redest du? :freak:

Ganz sicher, daß du auch wirklich weißt, wie man im Process Explorer offene Datei-Handles anzeigen kann?
1) View -> Show Lower Pane
2) View -> Lower Pane View -> Handles
3) Verdächtigen Prozess markieren und im unteren Fenster schauen, ob da irgendwo ein Element vom Typ "File" mit dem passenden Pfad steht.

EDIT: Noch besser, im Menu Find -> Find Handle Or DLL den Pfad der Datei eingeben.
 
Zuletzt bearbeitet:
sry meinte Zeile 16. und 21. Hatte den Code nochmal angepasst. Den Process Explorer checke ich dann nochmal kurz. Danke!

€: habs nochmal überprüft. Wird nirgendwo verwendet.
 
Zuletzt bearbeitet:
Hmm, du schließt ja in Zeile 21 mit i.close() zumindest dem Anschein nach die Datei wieder (ich konnte in der PIL-Doku nix über diese close()-Methode in Erfahrung bringen). Von daher sollte das soweit eigentlich ok sein. Wenn du ganz sicher sein willst, würde ich dir raten, vor Zeile 54 (also vor dem rename) irgend was einzubauen, daß den Prozess anhält (könntest ja was von der Konsole lesen) und dann nochmal im Prozess Explorer schauen, ob die Datei offen ist (im Python-Prozess). Wenn ja, dann schließt dieses i.close() die Datei wohl doch nicht.
 
Nen kumpel hat nochmal drüber geguckt und nen with open ergänzt. dann gings:

Code:
with open(fn, 'rb') as f:
        try:
            i = Image.open(f)
            info = i._getexif()
            for tag, value in info.items():
                decoded = TAGS.get(tag, tag)
                exifdata[decoded] = value
            return exifdata
        except:
            #if file is not a picture
            return False
 
Zurück
Oben