Jak przenieść plik?
Spojrzałem w pytona os
interfejsu, ale nie był w stanie zlokalizować metody przenoszenia pliku. Jak zrobić odpowiednik $ mv ...
w Pythonie?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
9 answers
os.rename()
, shutil.move()
, lub os.replace()
Wszystkie używają tej samej 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 argumentach źródłowych, jak i docelowych. Jeśli zostanie zmieniony, plik zostanie przemianowany, a także przeniesiony.
Zauważ również, że w dwóch pierwszych przypadkach katalog, w którym tworzony jest nowy plik, musi już istnieć. W systemie Windows plik o tej nazwie nie może istnieć lub zostanie podniesiony wyjątek, ale os.replace()
będzie cicho zastąp plik nawet w tym wystąpieniu.
Jak zauważono w komentarzach do innych odpowiedzi, shutil.move
w większości przypadków po prostu wywołuje os.rename
. Jeśli jednak miejsce docelowe znajduje się na innym dysku niż Źródło, skopiuje, a następnie usunie plik źródłowy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-11 18:21:44
Chociaż os.rename()
i shutil.move()
zmienią nazwy plików, komendą najbliższą Komendzie MV Uniksa jest shutil.move()
. Różnica polega na tym, że os.rename()
nie działa, jeśli źródło i miejsce docelowe znajdują się na różnych dyskach, podczas gdy shutil.move()
nie obchodzi, na jakim dysku znajdują się pliki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-30 21:28:33
Po Pythonie 3.4, możesz również użyć klasy pathlib
Path
do przenoszenia pliku.
from pathlib import Path
Path("path/to/current/file.foo").rename("path/to/new/destination/for/file.foo")
Https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-24 16:01:52
Dla obu os.Zmień nazwę lub shutil.move będziesz musiał zaimportować moduł. Do przeniesienia wszystkich plików nie jest potrzebny znak*.
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żywaliśmy systemu operacyjnego.listdir, aby zobaczyć, że nazwa folderu faktycznie się zmieniła.
Szutil przenosi cel z powrotem do źródła.
>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
Tym razem sprawdziłem w folderze źródłowym, aby upewnić się, że jest super.utworzony przeze mnie plik txt istnieje. On tam :)
Teraz przenieśliśmy folder i jego pliki ze źródła do miejsca docelowego i z powrotem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-09 01:27:20
Tego właśnie używam w tej chwili:
import os, shutil
path = "/volume1/Users/Transfer/"
moveto = "/volume1/Users/Drive_Transfer/"
files = os.listdir(path)
files.sort()
for f in files:
src = path+f
dst = moveto+f
shutil.move(src,dst)
Teraz w pełni funkcjonalny. Mam nadzieję, że to ci pomoże.
Edit:
Zamieniłem to w funkcję, która akceptuje katalog źródłowy i docelowy, tworząc folder docelowy, jeśli nie istnieje, i przenosi pliki. Pozwala również na filtrowanie plików src, na przykład jeśli chcesz przenosić tylko obrazy, wtedy używasz wzorca '*.jpg'
, domyślnie przenosi wszystko w katalogu
import os, shutil, pathlib, fnmatch
def move_dir(src: str, dst: str, pattern: str = '*'):
if not os.path.isdir(dst):
pathlib.Path(dst).mkdir(parents=True, exist_ok=True)
for f in fnmatch.filter(os.listdir(src), pattern):
shutil.move(os.path.join(src, f), os.path.join(dst, f))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-21 00:21:11
Przyjęta odpowiedź nie jest właściwa, ponieważ pytanie nie dotyczy zmiany nazwy pliku na plik, ale przeniesienia wielu plików do katalogu. shutil.move
wykona pracę, ale w tym celu {[1] } jest bezużyteczny (jak zaznaczono w komentarzach), ponieważ destination musi mieć jawną nazwę pliku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-17 14:23:39
Na podstawie odpowiedzi opisanej tutaj , użycie subprocess
jest inną opcją.
Coś takiego:
subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)
Jestem ciekaw, jakie są zalety i wady tej metody w porównaniu z shutil
. Ponieważ w moim przypadku używam już subprocess
z innych powodów i wydaje się, że działa, jestem skłonny się go trzymać.
Czy może jest zależny od systemu?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-16 01:50:30
Jest to rozwiązanie, które nie umożliwia shell
używania mv
.
from subprocess import Popen, PIPE, STDOUT
source = "path/to/current/file.foo",
destination = "path/to/new/destination/for/file.foo"
p = Popen(["mv", "-v", source, destination], stdout=PIPE, stderr=STDOUT)
output, _ = p.communicate()
output = output.strip().decode("utf-8")
if p.returncode:
print(f"E: {output}")
else:
print(output)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-04 10:06:38
import os,shutil
current_path = "" ## source path
new_path = "" ## destination path
os.chdir(current_path)
for files in os.listdir():
os.rename(files, new_path+'{}'.format(f))
shutil.move(files, new_path+'{}'.format(f)) ## to move files from
Inny dysk ex. C: -- > D:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-07 13:46:06