Katalog, który chcemy utworzyć, już istnieje

Problem: Istnieje już katalog, który chcemy utworzyć

To będzie bardzo prosty test. Uruchom nasz skrypt ponownie (bez usuwania już utworzonego katalogu newTestFiles). Oto co dostaniemy w konsoli:

New directory will be created in: "C:\Projects\pythonFiles"
New directory path: "testFiles\newTestFiles"
Traceback (most recent call last):
  File "C:/Projects/pythonFiles/create_dir.py", line 7, in <module&;gt;
    os.mkdir(dir_full_path)
FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'testFiles\\newTestFiles'

Process finished with exit code 1

Ostatnia linia z opisem błędu, dodatkowo zestawiona z wypisywanymi informacjami od razu pozwala nam stwierdzić, gdzie i jaki katalog już istnieje:

New directory will be created in: "C:\Projects\pythonFiles"
New directory path: "testFiles\newTestFiles"

FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'testFiles\\newTestFiles'

Rozwiązanie

Gdy chcemy zabezpieczyć się przed problemem z potencjalnie istniejącym katalogiem, możemy użyć funkcji os.path.exists.

Funkcja ta zwraca wartość True w przypadku, gdy katalog istnieje, oraz False w przeciwnym wypadku. Gdybyśmy chcieli zastosować ją w powyższym przypadku, to nasz kod przyjąłby postać:

import os

dir_full_path = os.path.join("testFiles","newTestFiles")
print(f'New directory will be created in: "{os.getcwd()}"')
print(f'New directory path: "{dir_full_path}"')

if not os.path.exists(dir_full_path):
    os.mkdir(dir_full_path)
TIP: Zastosowaliśmy tutaj negację, czyli konstrukcję if not. Dzięki niej instrukcja w ciele if wykona się gdy warunek nie będzie spełniony.

W tym przypadku pytamy os.path.exists: czy ścieżka istnieje. Jeśli os.path.exists(dir_full_path) odpowie negatywnie (False) to jest to sygnał do akceptacji warunku if not.

Taka konstrukcja:
if not os.path.exists(dir_full_path)
Jest równoważna z:
if os.path.exists(dir_full_path)==False

Sprawdź teraz czy wielokrotne uruchomienie skryptu nadal zwraca błąd 😉

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *