Come spostare un file in Python

Ho cercato nell'interfaccia Python os, ma non sono riuscito a trovare un metodo per spostare un file. Come potrei fare l'equivalente di $ mv ... in Python?

>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
Soluzione

os.rename(), shutil.move(), o os.replace()

Tutti impiegano la stessa sintassi:

import os
import shutil

os.rename("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
shutil.move("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
os.replace("path/to/current/file.foo", "path/to/new/destination/for/file.foo")

Nota che devi includere il nome del file (file.foo) in entrambi gli argomenti sorgente e destinazione. Se viene cambiato, il file verrà rinominato e spostato. Notate anche che nei primi due casi la directory in cui viene creato il nuovo file deve già esistere. Su Windows, un file con quel nome non deve esistere o verrà sollevata un'eccezione, ma os.replace() sostituirà silenziosamente un file anche in quel caso.

Come è stato notato nei commenti ad altre risposte, shutil.move chiama semplicemente os.rename nella maggior parte dei casi. Tuttavia, se la destinazione è su un disco diverso da quello di origine, invece copierà e poi cancellerà il file di origine.

Commentari (8)

Anche se os.rename() e shutil.move() rinominano entrambi i file, il comando che più si avvicina al comando mv di Unix è shutil.move(). La differenza è che os.rename()non funziona se la sorgente e la destinazione sono su dischi diversi, mentre shutil.move()non si preoccupa del disco su cui si trovano i file.

Commentari (3)

Per os.rename o shutil.move è necessario importare il modulo. Nessun carattere * è necessario per ottenere tutti i file spostati.

Abbiamo una cartella in /opt/awesome chiamata source con un file chiamato awesome.txt.

in /opt/awesome
○ → ls
source
○ → ls source
awesome.txt

python 
>>> source = '/opt/awesome/source'
>>> destination = '/opt/awesome/destination'
>>> import os
>>> os.rename(source, destination)
>>> os.listdir('/opt/awesome')
['destination']

Abbiamo usato os.listdir per vedere che il nome della cartella è effettivamente cambiato. Ecco lo shutil che sposta la destinazione di nuovo all'origine.

>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']

Questa volta ho controllato nella cartella source per essere sicuro che il file awesome.txt che ho creato esista. È lì :)

Ora abbiamo spostato una cartella e i suoi file da una sorgente a una destinazione e viceversa.

Commentari (2)