Soru shutil.copy dosyaları için hedef yol oluştur


Gibi bir yol b/c/ içinde yok ./a/b/c , shutil.copy("./blah.txt", "./a/b/c/blah.txt") hedefin mevcut olmadığını şikayet edecektir. Hem hedef yolu oluşturmanın hem de dosyayı bu yola kopyalamanın en iyi yolu nedir?


20
2018-05-08 11:00


Menşei




Cevaplar:


kullanım os.makedirs dizin ağacını oluşturmak için


21
2018-05-08 11:11



Unutmayın ki exists_ok seçenek sadece Python 3.2+ sürümünde mevcuttur - Grant Humphries
Onun exist_ok, değil exists_ok - CharlesB


Dizin böyle bir şey yapmadan önce var olup olmadığını kontrol etmek için buna benzer bir şey kullanırım.

if not os.path.exists('a/b/c/'):
    os.mkdir('a/b/c')

17
2017-07-19 19:12



Bildiğim kadarıyla, bu Python 2.7'de çalışmaz: OSError: [Errno 2] Böyle bir dosya veya dizin yok: './a/b/c' - SummerBreeze
Kullanmayı tercih ederim os.makedirs bunun yerine, varsa, ana dizinleri oluşturur. - feilong
Bunun bir yarış durumundan muzdarip olduğunun farkında olun (başka biri veya başka bir konu kontrol ve arama arasında bir dizin oluşturuyorsa) makedirs). Aramak daha iyi os.makedirs Klasör var ise istisna yakalamak. Dizin oluşturma için SoF kontrol edin. - farmir


EAFP yolu, yarışları ve gereksiz syscalls önlemek:

import errno
import os
import shutil

src = "./blah.txt"
dest = "./a/b/c/blah.txt"
# with open(src, 'w'): pass # create the src file
try:
    shutil.copy(src, dest)
except IOError as e:
    # ENOENT(2): file does not exist, raised also on missing dest parent dir
    if e.errno != errno.ENOENT:
        raise
    # try creating parent directories
    os.makedirs(os.path.dirname(dest))
    shutil.copy(src, dest)

7
2017-09-02 14:08



Hala bir yarış var dest Dir çağrıldıktan sonra oluşturulur shutil.copy ama çağrıdan önce os.makedirs. - Lii


Verilen cevaplardan ve yorumlardan gelen bilgileri özetlemek için:

Python 3.2+ için os.mkdirs önce copy ile exist_ok=True:

os.makedirs(os.path.dirname(dest_fpath), exist_ok=True)
shutil.copy(src_fpath, dest_fpath)

Python <3.2 için os.mkdirs yakaladıktan sonra IOError ve tekrar kopyalamayı deneyin:

try:
    shutil.copy(src_fpath, dest_fpath)
except IOError as io_err:
    os.makedirs(os.path.dirname(dest_fpath)
    shutil.copy(src_fpath, dest_fpath)

Kontrol konusunda daha açık olsanız da errno ve / veya yolun olup olmadığını kontrol etme exists önce mkdirs, IMHO bu snippet'leri sadelik ve işlevsellik arasında güzel bir denge kurar.


2
2018-04-02 16:36





Beş sentim orada bir sonraki yaklaşım olacaktı:

# Absolute destination path.
dst_path = '/a/b/c/blah.txt'
origin_path = './blah.txt'
not os.path.exists(dst_path) or os.makedirs(dst_path)
shutil.copy(origin_path, dst_path)

1
2018-05-25 00:12





Yolun dışına çıkmak için bölünmeyi kullanmam nasıl olur?

dir_name, _ = os.path.split("./a/b/c/blah.txt")

sonra

os.makedirs(dir_name,exist_ok=True)

ve sonunda

shutil.copy("./blah.txt", "./a/b/c/blah.txt")

1
2018-06-02 08:23