Python parece ter funções para copiar arquivos (por exemplo shutil.copy
) e funções para copiar diretórios (por exemplo shutil.copytree
), mas não encontrei nenhuma função que lide com ambos. Claro, é trivial verificar se você deseja copiar um arquivo ou diretório, mas parece uma omissão estranha.
Não existe realmente nenhuma função padrão que funcione como o cp -r
comando unix , ou seja, suporta diretórios e arquivos e cópias recursivas? Qual seria a maneira mais elegante de contornar esse problema em Python?
copytree
a cópia de um único arquivo?Respostas:
Eu sugiro que você chame primeiro
shutil.copytree
e, se uma exceção for lançada, tente novamente comshutil.copy
.fonte
shutil.copytree
função de melhorar e gerenciar ambos os casos no futuro. 4) As exceções não são tão excepcionais em Python; por exemplo, uma iteração para lançando uma exceção StopIteration.Para adicionar respostas Tzot e gns , aqui está uma maneira alternativa de copiar arquivos e pastas recursivamente. (Python 3.X)
Se for sua primeira vez e você não tiver ideia de como copiar arquivos e pastas recursivamente, espero que isso ajude.
fonte
shutil.copy
eshutil.copy2
estão copiando arquivos.shutil.copytree
copia uma pasta com todos os arquivos e todas as subpastas.shutil.copytree
está usandoshutil.copy2
para copiar os arquivos.Portanto, o análogo a
cp -r
você está dizendo é que oshutil.copytree
porquecp -r
direciona e copia uma pasta e seus arquivos / subpastas comoshutil.copytree
. Sem as-r
cp
cópias de arquivos comoshutil.copy
eshutil.copy2
fazer.fonte
shutil.copytree('C:\myfile.txt', 'C:\otherfile')
. Não funciona. É sobre isso que o OP estava perguntando ... 7 anos atrás.Unix
cp
não 'suporta diretórios e arquivos':Para fazer o cp copiar um diretório, você deve informar manualmente ao cp que é um diretório, usando a opção '-r'.
Porém, há alguma desconexão aqui -
cp -r
quando passado um nome de arquivo como fonte, felizmente copiaremos apenas o arquivo único; copytree não.fonte
Eu acho que copy_tree é o que você está procurando
fonte
O método python shutil.copytree é uma bagunça. Eu fiz um que funciona corretamente:
fonte