Jak skopiować katalog i jego zawartość do istniejącej lokalizacji za pomocą Pythona?

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

Dokładny wynik, którego szukam, to skopiowanie całej struktury folderów na innym, bezgłośne nadpisanie wszystkich znalezionych duplikatów. Zanim wskoczę i zacznę pisać własną funkcję, aby to zrobić Pomyślałem, że zapytam, Czy ktoś zna istniejący przepis lub fragment, który tak robi.

Author: Soviut, 2009-02-04

4 answers

distutils.dir_util.copy_tree robi, co chcesz.

Skopiuj całe drzewo katalogów src do nowa lokalizacja dst. Zarówno src, jak i dst to muszą być nazwy katalogów. Jeśli src nie jest katalog, raise DistutilsFileError. Jeśli dst nie istnieje, jest tworzony z mkpath (). Efekt końcowy kopii jest to, że każdy plik w src jest skopiowane do dst, a katalogi pod src są rekurencyjnie kopiowane do dst. Zwraca listę plików, które zostały skopiowane lub mogły zostać skopiowane, korzystając z ich nazwa wyjścia. Powrót wartość nie ma wpływu na aktualizację lub dry_run: to po prostu lista wszystkich pliki pod src, z nazwami zmieniono na dst.

(więcej dokumentacji pod powyższym adresem url)

 43
Author: Ali Afshar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-04 17:03:21

Dlaczego nie zaimplementować go na własną rękę używając os.walk?

 0
Author: Swaroop C H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-04 16:56:19

Do takich operacji na plikach highlevel użyj modułu shutil i w Twoim przypadku funkcji copytree. Myślę, że to jest czystsze niż" nadużywanie " distutils.

UPDATE: : zapomnij o odpowiedzi, przeoczyłem, że OP próbował shutil.

 0
Author: André,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-07 10:00:33

Czy dostajesz błąd, który mówi "nie można utworzyć katalogu, gdy jest już obecny"? Nie jestem pewien, jak bardzo to głupie, ale wszystko, co zrobiłem, to wstawienie pojedynczej linii 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 trochę bluder. Jeśli tak, to czy ktoś mógłby mi to wskazać? Sorry, jestem nowy w Pythonie: P
 0
Author: carlosfigueira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-05 21:03:02