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
Author: martineau, 2012-01-13

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.

 1554
Author: ig0774,
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.

 264
Author: Jim Calfas,
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

 54
Author: MoonFruit,
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.

 40
Author: jmontross,
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))
 20
Author: Peter Vlaar,
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.

 13
Author: Javier Palacios,
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?

 2
Author: Bill,
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)
 0
Author: alper,
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:

 -1
Author: Ned Slark,
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