Как переместить файл в Python - PullRequest
721 голосов
/ 14 января 2012

Я посмотрел на интерфейс Python os, но не смог найти метод для перемещения файла.Как бы я сделал эквивалент $ mv ... в Python?

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

Ответы [ 9 ]

1043 голосов
/ 14 января 2012

os.rename() или shutil.move()

Оба используют один и тот же синтаксис:

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")

Обратите внимание, что в обоих случаях каталогв котором создается новый файл, он должен уже существовать (но в Windows файл с таким именем не должен существовать или возникнет исключение).Также обратите внимание, что вы должны включить имя файла (file.foo) как в исходный, так и в целевой аргументы.Если он будет изменен, файл будет переименован, а также перемещен.

Как было отмечено в комментариях к другим ответам, shutil.move просто вызывает os.rename в большинстве случаев.Однако, если место назначения находится на диске, отличном от исходного, оно вместо этого скопирует и затем удалит исходный файл.

218 голосов
/ 31 мая 2013

Хотя os.rename() и shutil.move() будут оба переименовывать файлы, команда, ближайшая к команде Unix mv, - shutil.move().Разница в том, что os.rename() не работает, если источник и место назначения находятся на разных дисках, тогда как shutil.move() не волнует, на каком диске находятся файлы.

31 голосов
/ 22 февраля 2013

Для os.rename или shutil.move вам необходимо импортировать модуль. Символ * не нужен для перемещения всех файлов.

У нас есть папка в / opt / awesome с именем source и одним файлом с именем 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']

Мы использовали os.listdir, чтобы увидеть, что имя папки действительно изменилось. Вот шутиль, перемещающий пункт назначения обратно к источнику.

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

На этот раз я проверил внутри папки с исходным кодом, чтобы убедиться, что созданный мной файл awesome.txt существует. Это там :)

Теперь мы переместили папку и ее файлы из источника в место назначения и обратно.

12 голосов
/ 12 октября 2018

После Python 3.4 вы также можете использовать pathlib класс 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

11 голосов
/ 12 ноября 2016

Это то, что я сейчас использую:

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)

Теперь полностью работоспособен. Надеюсь, это поможет вам.

Edit:

Я превратил это в функцию, которая принимает каталог источника и назначения, создает папку назначения, если она не существует, и перемещает файлы. Также позволяет фильтровать файлы src, например, если вы хотите только перемещать изображения, тогда вы используете шаблон '*.jpg', по умолчанию он перемещает все в каталоге

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))
10 голосов
/ 17 октября 2016

Принятый ответ не является правильным, потому что вопрос не в переименовании файла в файл, а в перемещении многих файлов в каталог. shutil.move сделает работу, но для этой цели os.rename бесполезен (как указано в комментариях), потому что у места назначения должно быть явное имя файла.

1 голос
/ 16 июня 2018

На основании ответа , описанного здесь , использование subprocess является еще одним вариантом.

Примерно так:

subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)

Мне любопытно узнать плюсы и минусы этого метода по сравнению с shutil.Поскольку в моем случае я уже использую subprocess по другим причинам, и, похоже, он работает, я склонен придерживаться его.

Возможно, это зависит от системы?

0 голосов
/ 12 сентября 2018

Это решение, которое не позволяет shell использовать mv.

import subprocess

source      = 'pathToCurrent/file.foo'
destination = 'pathToNew/file.foo'

p = subprocess.Popen(['mv', source, destination], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
res = p.communicate()[0].decode('utf-8').strip()

if p.returncode:
    print 'ERROR: ' + res
0 голосов
/ 07 мая 2018
  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 

другой диск отл.C: -> D:

...