Zajrzałem do interfejsu Pythona os
, ale nie byłem w stanie zlokalizować metody przenoszenia pliku. Jak mógłbym zrobić odpowiednik $ mv ...
w Pythonie?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
os.rename()
, shutil.move()
, lub os.replace()
.
Wszystkie wykorzystują tę samą składnię:
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")
Zauważ, że musisz podać nazwę pliku (file.foo
) zarówno w źródłowym jak i docelowym argumencie. Jeśli zostanie ona zmieniona, plik zostanie przemianowany, jak również przeniesiony.
Zauważ również, że w pierwszych dwóch przypadkach katalog, w którym tworzony jest nowy plik musi już istnieć. W Windows, plik o tej nazwie nie może istnieć lub zostanie zgłoszony wyjątek, ale os.replace()
bezgłośnie zastąpi plik nawet w takim przypadku.
Jak zauważono w komentarzach do innych odpowiedzi, shutil.move
po prostu wywołuje os.rename
w większości przypadków. Jednakże, jeśli miejsce docelowe jest na innym dysku niż źródło, to zamiast tego skopiuje, a następnie usunie plik źródłowy.
Chociaż os.rename()
i shutil.move()
zmienią nazwy plików, komenda, która jest najbliższa uniksowej komendzie mv to shutil.move()
. Różnica polega na tym, że os.rename()
nie działa jeśli źródło i miejsce docelowe są na różnych dyskach, podczas gdy shutil.move()
nie dba o to na jakim dysku są pliki.
Zarówno dla os.rename jak i shutil.move będziesz musiał zaimportować moduł. Żaden znak * nie jest konieczny, aby wszystkie pliki zostały przeniesione.
Mamy folder w /opt/awesome o nazwie source z jednym plikiem o nazwie 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']
Użyliśmy os.listdir, aby zobaczyć, że nazwa folderu faktycznie się zmieniła. Oto shutil przenoszący miejsce docelowe z powrotem do źródłowego.
>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
Tym razem sprawdziłem wewnątrz folderu źródłowego, aby upewnić się, że plik awesome.txt, który utworzyłem istnieje. Jest tam :)
Teraz przenieśliśmy folder i jego pliki ze źródła do miejsca docelowego i z powrotem.