Examinei a os
interface do Python , mas não consegui localizar um método para mover um arquivo. Como eu faria o equivalente $ mv ...
em Python?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
python
file
file-handling
David542
fonte
fonte
mv
comando do gnu-coreutils , o python'sshutil.move
tem um caso de borda em que ashutil.move
função difere. Clique aqui para obter a gravação completa . Em poucas palavras, o Pythonshutil.move
criará uma exceção (mas o gnu-coreutilsmv
não) quando o seu destino for um diretório e o diretório já tiver um arquivo com o mesmo nome que a fonte (novamente, para obter mais informações, consulte o link fornecido na frase anterior). )os.system("mv file1 file2")
?Respostas:
os.rename()
,shutil.move()
ouos.replace()
Todos empregam a mesma sintaxe:
Observe que você deve incluir o nome do arquivo (
file.foo
) nos argumentos de origem e de destino. Se for alterado, o arquivo será renomeado e movido.Observe também que nos dois primeiros casos o diretório no qual o novo arquivo está sendo criado já deve existir. No Windows, um arquivo com esse nome não deve existir ou uma exceção será gerada, mas
os.replace()
substituirá silenciosamente um arquivo mesmo nessa ocorrência.Como foi observado nos comentários sobre outras respostas,
shutil.move
basta ligaros.rename
na maioria dos casos. No entanto, se o destino estiver em um disco diferente da fonte, ele copiará e excluirá o arquivo de origem.fonte
shutil.move
trabalha para diretórios. Você pode usar o caminho relativoshutil.move(f.name, "tmp/")
ou caminho completoshutil.move(f.name, "/Users/hello/tmp/")
, não use~
no caminho, o check-in python2.7.9, Mac OS X.~
é uma construção shell e não tem nada a ver com os caminhos de arquivo em si, exceto como uma convenção extraviada. Se você realmente deseja envolver seu diretório pessoal, use-oos.getenv('HOME')
, concatenando-o com partes do caminho desejado, se necessário.os.path.expanduser()
para expandir adequadamente o '~
' de acordo com regras específicas do sistema operacional. Muito mais organizado, pois%HOME%
nem sempre é definido no Windows.os.rename
não manipula arquivos em diferentes dispositivos. Useshutil.move
se você não tiver certeza de que a fonte e o arquivo de destino estão no mesmo dispositivo.Embora
os.rename()
eshutil.move()
renomeiem os arquivos, o comando mais próximo do comando Unix mv éshutil.move()
. A diferença é queos.rename()
não funciona se a origem e o destino estiverem em discos diferentes, enquantoshutil.move()
não se importa em que disco os arquivos estão.fonte
shutil.move()
usaos.rename()
se o destino estiver no sistema de arquivos atual. Caso contrário,shutil.move()
copia a fonte para o destino usandoshutil.copy2()
e remove a fonte.shutil.copy2()
não é possível copiar todos os metadados do arquivo ; portanto, se isso acontece, é como fazercp -p
erm
, então , eu entendo.Para os.rename ou shutil.move, você precisará importar o módulo. Nenhum caractere * é necessário para mover todos os arquivos.
Temos uma pasta em / opt / awesome chamada source com um arquivo chamado awesome.txt.
Usamos o os.listdir para ver que o nome da pasta realmente mudou. Aqui está o obturador movendo o destino de volta à fonte.
Desta vez, verifiquei dentro da pasta de origem para ter certeza de que o arquivo awesome.txt que criei existe. Está aí :)
Agora, movemos uma pasta e seus arquivos de uma origem para um destino e voltamos novamente.
fonte
Após o Python 3.4, você também pode usar
pathlib
a classe dePath
para mover o arquivo.https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename
fonte
É isso que estou usando no momento:
Agora totalmente funcional. Espero que isso ajude você.
Editar:
Transformei isso em uma função, que aceita um diretório de origem e destino, criando a pasta de destino, se não existir, e move os arquivos. Também permite a filtragem dos arquivos src, por exemplo, se você deseja apenas mover imagens, então usa o padrão
'*.jpg'
, por padrão, ele move tudo no diretóriofonte
os.path.join(parent_path, filename)
em vez de concatenação para evitar problemas de plataforma cruzadaA resposta aceita não é a correta, porque a questão não é renomear um arquivo para um arquivo, mas mover muitos arquivos para um diretório.
shutil.move
fará o trabalho, mas para esse propósitoos.rename
é inútil (conforme declarado nos comentários) porque o destino deve ter um nome de arquivo explícito.fonte
os.path.basename(my_file_path)
e diretórios de arquivosos.path.dirname(my_file_path)
. Além disso, o OP não ficou muito claro se ele queria mover vários arquivos. Ele mencionou mover apenas um arquivo na pergunta, mas seu código de exemplo implicava mover vários arquivos.Com base na resposta descrita aqui , usar
subprocess
é outra opção.Algo assim:
Estou curioso para saber os prós e contras deste método em comparação com
shutil
. Como no meu caso, já estou usandosubprocess
por outros motivos e parece funcionar, estou inclinado a segui-lo.Talvez seja dependente do sistema?
fonte
mv
sendo usado com sucesso em um sistema operacional Windows.Esta é uma solução que não permite o
shell
usomv
.fonte
disco diferente ex. C: -> D:
fonte
f"{new_path}{f}"
mas, como você não possui texto estático na string, pode ser mais trabalhoso ... Estou tentando adquirir o hábito de usar f-strings embora.