2009-02-04 9 views
32

Próbuję skopiować katalog i całą jego zawartość do ścieżki, która już istnieje. Problem polega na tym, że pomiędzy modułem os a modułem shutil nie ma na to sposobu. funkcja shutil.copytree() oczekuje, że docelowa ścieżka nie istnieje wcześniej.Jak skopiować katalog i jego zawartość do istniejącej lokalizacji za pomocą języka Python?

Dokładny wynik, którego szukam, polega na skopiowaniu całej struktury folderów na drugą stronę, nadpisując w sposób cichy wszystkie odnalezione duplikaty. Zanim wskoczę i zacznę pisać własną funkcję, aby to zrobić, pomyślałem, że zapytam, czy ktokolwiek wie o istniejącym przepisie, który to robi.

Odpowiedz

42

distutils.dir_util.copy_tree robi to, co chcesz.

Copy an entire directory tree src to a new location dst. Both src and dst must be directory names. If src is not a directory, raise DistutilsFileError. If dst does not exist, it is created with mkpath(). The end result of the copy is that every file in src is copied to dst, and directories under src are recursively copied to dst. Return the list of files that were copied or might have been copied, using their output name. The return value is unaffected by update or dry_run: it is simply the list of all files under src, with the names changed to be under dst.

(więcej dokumentacji w powyższym URL)

+1

Nie widziałem tego wcześniej, dobre znalezisko. Moim jedynym zastrzeżeniem jest to, że nie daje wskazania, które pliki zostały nadpisane i które zostały utworzone na nowo. Tak długo, jak nie jest to wymagane, wygląda to doskonale. –

+0

To jest dobre, chociaż będzie wymagało zainstalowania distutils. To nie jest taki duży problem, ponieważ i tak łączymy to z EXE przy pomocy Pyinstalatora. – Soviut

+0

distutils jest częścią standardowej biblioteki, więc teoretycznie powinno być zawsze instalowane. –

0

Dlaczego nie wdrożyć go samodzielnie, używając os.walk?

+5

to właśnie rozważałem, ale chciałem się upewnić, że nie wymyślam koła. – Soviut

0

Dla HighLevel operacji na plikach tak użyć modułu shutil iw Twoim przypadku funkcji copytree. Myślę, że jest to czystsze niż "nadużywanie" distutils.

AKTUALIZACJA:: Zapomnij o odpowiedzi, przeoczyłem, że OP próbował zamknąć.

+1

Wspomniałem w moim pytaniu, że shutil.copytree() jest tym, co próbowałem użyć, ale nie pasuje do rachunku. – Soviut

+1

Zazwyczaj zgadzam się z tym, ale nie całkiem robi to, o co prosił O.P. –

+1

Masz rację, zapomniałem o tym w pytaniu, było za późno tego wieczoru :-) –

0

Czy otrzymujesz komunikat o błędzie "Nie można utworzyć katalogu, gdy jest już dostępny"? Nie jestem pewien, ile głupie to jest, ale wszystko zrobiłem było wstawić pojedynczą linię do modułu copytree: zmieniłem:

def copytree(src, dst, symlinks=False): 
    names = os.listdir(src) 
    os.makedirs(dst) 

do:

def copytree(src, dst, symlinks=False): 
    names = os.listdir(src) 
    if (os.path.isdir(dst)==False): 
     os.makedirs(dst)  

Chyba zrobiłem kilka bluder. Jeśli tak, czy ktoś mógłby mnie o tym poinformować? Przepraszam, jestem bardzo nowy w pytonie: P

Powiązane problemy