Wydaje się, że Python ma funkcje do kopiowania plików (np. shutil.copy
) I funkcje do kopiowania katalogów (np. shutil.copytree
), Ale nie znalazłem żadnej funkcji, która obsługuje oba. Jasne, sprawdzenie, czy chcesz skopiować plik lub katalog, jest trywialne, ale wydaje się, że jest to dziwne pominięcie.
Czy naprawdę nie ma standardowej funkcji, która działa jak cp -r
polecenie unix , tj. Obsługuje zarówno katalogi, jak i pliki i kopiuje rekursywnie? Jaki byłby najbardziej elegancki sposób obejścia tego problemu w Pythonie?
copytree
skopiowanie pojedynczego pliku?Odpowiedzi:
Proponuję najpierw wywołać
shutil.copytree
, a jeśli zostanie zgłoszony wyjątek, spróbuj ponownie za pomocąshutil.copy
.źródło
shutil.copytree
funkcja w przyszłości usprawniała oba przypadki i zarządzała nimi. 4) Wyjątki nie są aż tak wyjątkowe w Pythonie; np. iteracja zatrzymuje się, zgłaszając wyjątek StopIteration.Aby dodać na Tzot-tych i GNS odpowiedzi, tutaj jest alternatywnym sposobem kopiowania plików i folderów rekurencyjnie. (Python 3.X)
Jeśli to Twój pierwszy raz i nie masz pojęcia, jak rekurencyjnie kopiować pliki i foldery, mam nadzieję, że to pomoże.
źródło
shutil.copy
ishutil.copy2
kopiujesz pliki.shutil.copytree
kopiuje folder ze wszystkimi plikami i wszystkimi podfolderami.shutil.copytree
jest używaneshutil.copy2
do kopiowania plików.Więc analogiem do
cp -r
ciebie jest to,shutil.copytree
ponieważcp -r
kieruje i kopiuje folder i jego pliki / podfoldery, takie jakshutil.copytree
. Bez-r
cp
kopii pliki lubiąshutil.copy
ishutil.copy2
robią.źródło
shutil.copytree('C:\myfile.txt', 'C:\otherfile')
. To nie działa. O to właśnie pytał OP ... 7 lat temu.Unix
cp
nie „obsługuje zarówno katalogów, jak i plików”:Aby cp skopiować katalog, musisz ręcznie powiedzieć cp, że jest to katalog, używając flagi „-r”.
Jest tu jednak pewne rozłączenie -
cp -r
po przekazaniu nazwy pliku jako źródła z radością skopiuje tylko jeden plik; copytree nie będzie.źródło
Myślę, że copy_tree jest tym, czego szukasz
źródło
Metoda python shutil.copytree to bałagan. Zrobiłem taki, który działa poprawnie:
źródło