de-vraag
  • Pytania
  • Tagi
  • Użytkownicy
Powiadomienia
Nagrody
Rejestracja
Po zarejestrowaniu się, będziesz otrzymywać powiadomienia o odpowiedziach i komentarzach do swoich pytań.
Zaloguj się
Brak tłumaczeń pasujących do Twojego wyszukiwania Jeśli masz już konto, zaloguj się, aby sprawdzić nowe powiadomienia.
Za dodane pytania, odpowiedzi i komentarze przewidziane są nagrody.
Więcej
Źródło
Edytuj
 Parand
Parand
Question

Jak mogę bezpiecznie utworzyć katalog zagnieżdżony?

Jaki jest najbardziej elegancki sposób na sprawdzenie, czy katalog, do którego ma być zapisany plik, istnieje, a jeśli nie, utworzenie katalogu za pomocą Pythona? Oto, co próbowałem:

import os

file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)

try:
    os.stat(directory)
except:
    os.mkdir(directory)       

f = file(filename)

W jakiś sposób przegapiłem os.path.exists (dzięki kanja, Blair i Douglas). To jest to, co mam teraz:

def ensure_dir(file_path):
    directory = os.path.dirname(file_path)
    if not os.path.exists(directory):
        os.makedirs(directory)

Czy jest jakaś flaga dla "open", która sprawia, że dzieje się to automatycznie?

3872 2008-11-07T18:56:45+00:00 3
 Georgy
Georgy
Edytowane pytanie 16. maja 2019 в 8:51
Programowanie
exception
path
python
directory
operating-system
To pytanie ma 1 odpowiedź w języku angielskim, aby je przeczytać zaloguj się na swoje konto.
Solution / Answer
Blair Conrad
Blair Conrad
7. listopada 2008 в 7:06
2008-11-07T19:06:07+00:00
Więcej
Źródło
Edytuj
#8619871

Widzę dwie odpowiedzi z dobrymi cechami, każda z małą wadą, więc dam moje ujęcie na ten temat:

Spróbuj os.path.exists, i rozważ os.makedirs do tworzenia.

import os
if not os.path.exists(directory):
    os.makedirs(directory)

Jak zauważono w komentarzach i gdzie indziej, istnieje warunek wyścigu – jeśli katalog zostanie utworzony pomiędzy wywołaniami os.path.exists i os.makedirs, os.makedirs zawiedzie z OSError. Niestety, wyłapywanie OSError i kontynuowanie nie jest niezawodne, ponieważ zignoruje niepowodzenie tworzenia katalogu z powodu innych czynników, takich jak niewystarczające uprawnienia, pełny dysk, itp.

Jedną z opcji byłoby złapanie OSError i zbadanie osadzonego kodu błędu (zobacz Czy istnieje międzyplatformowy sposób na uzyskanie informacji z Python's OSError):

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

Alternatywnie, może być drugi os.path.exists, ale załóżmy, że inny utworzył katalog po pierwszym sprawdzeniu, a następnie usunął go przed drugim – nadal możemy zostać oszukani.

W zależności od aplikacji, niebezpieczeństwo współbieżnych operacji może być większe lub mniejsze niż niebezpieczeństwo stwarzane przez inne czynniki, takie jak uprawnienia do plików. Programista musiałby wiedzieć więcej o konkretnej tworzonej aplikacji i jej oczekiwanym środowisku przed wyborem implementacji.

Współczesne wersje Pythona dość mocno poprawiają ten kod, zarówno poprzez wyeksponowanie FileExistsError (w wersji 3.3+)...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

...i przez umożliwienie argumentu słowa kluczowego do os.makedirs o nazwie exist_ok (w 3.2+).

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.
Adam Smith
Adam Smith
Edytowana odpowiedź 9. lutego 2019 в 5:51
10.1. os.path — Common pathname manipulations — Python 2.7.18 documentation
docs.python.org
15.1. os — Miscellaneous operating system interfaces — Python 2.7.18 documentation
docs.python.org
15.1. os — Miscellaneous operating system interfaces — Python v3.2.6 documentation
docs.python.org
4719
0
Douglas Mayle
Douglas Mayle
7. listopada 2008 в 7:01
2008-11-07T19:01:25+00:00
Więcej
Źródło
Edytuj
#8619870

Sprawdź os.makedirs: (Upewnia się, że kompletna ścieżka istnieje). Aby obsłużyć fakt, że katalog może istnieć, złap OSError. (Jeśli exist_ok jest False (domyślnie), to OSError jest podnoszony jeśli katalog docelowy już istnieje).

import os
try:
    os.makedirs('./path/to/somewhere')
except OSError:
    pass
 Georgy
Georgy
Edytowana odpowiedź 16. maja 2019 в 12:15
os — Miscellaneous operating system interfaces — Python 3.10.4 documentation
docs.python.org
76
0
 gone
gone
7. listopada 2008 в 7:00
2008-11-07T19:00:01+00:00
Więcej
Źródło
Edytuj
#8619869

Spróbuj funkcji os.path.exists

if not os.path.exists(dir):
    os.mkdir(dir)
 jesterjunk
jesterjunk
Edytowana odpowiedź 15. października 2015 в 4:05
10.1. os.path — Common pathname manipulations — Python 2.7.18 documentation
docs.python.org
33
0
Dodaj pytanie
Kategorie
Wszystkie
Technologia
Kultura / Rekreacja
Życie / Sztuka
Nauka
Profesjonalny
Biznes
Użytkownicy
Wszystkie
Nowy
Popularny
1
mohidil qodirova
Zarejestrowany 4 godziny temu
2
Jasur Fozilov
Zarejestrowany 18 godzin temu
3
Zuxriddin Muydinov
Zarejestrowany 1 dzień temu
4
Денис Анненский
Zarejestrowany 3 dni temu
5
365
Zarejestrowany 1 tydzień temu
DE
EL
ES
FI
FR
HU
ID
IT
JA
LT
LV
NL
PL
PT
RU
SV
ZH
© de-vraag 2022
Źródło
stackoverflow.com
na podstawie licencji cc by-sa 3.0 z przypisaniem