Я изучил интерфейс Python os
, но не смог найти метод перемещения файла. Как мне сделать эквивалент $ mv ...
в Python?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
os.rename()
, shutil.move()
, или os.replace()
Все они используют один и тот же синтаксис:
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")
Обратите внимание, что вы должны указать имя файла (file.foo
) как в аргументе источника, так и в аргументе назначения. Если оно будет изменено, файл будет переименован, а также перемещен.
Обратите также внимание, что в первых двух случаях каталог, в котором создается новый файл, должен уже существовать. В Windows файл с таким именем не должен существовать, иначе возникнет исключение, но os.replace()
молча заменит файл даже в этом случае.
Как было отмечено в комментариях к другим ответам, shutil.move
в большинстве случаев просто вызывает os.rename
. Однако, если место назначения находится на диске, отличном от исходного, он будет вместо этого копировать, а затем удалять исходный файл.
Хотя команды os.rename()
и shutil.move()
переименовывают файлы, наиболее близкой к команде Unix mv является команда shutil.move()
. Разница в том, что os.rename()
не работает, если источник и получатель находятся на разных дисках, а shutil.move()
не имеет значения, на каком диске находятся файлы.
Для 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, чтобы увидеть, что имя папки действительно изменилось. Вот shutil, перемещающий место назначения обратно в источник.
>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
На этот раз я проверил папку источника, чтобы убедиться, что созданный мной файл awesome.txt существует. Он там есть :)
Теперь мы переместили папку и ее файлы из исходной папки в конечную и обратно.
После того, как в Python 3.4, вы также можете использовать pathlib
'путь класса S, чтобы переместить файл.
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
Это то, что я'м, используя на данный момент:
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)
Теперь полностью функциональна. Надеюсь, это поможет вам.
Я'вэ превратил это в функцию, которая принимает исходный и конечный каталоги, делая папку назначения, если это не'т существуют, и перемещает файлы. Также позволяет фильтровать файлы 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))
Принятый ответ не правильный, потому что вопрос не о переименовании файла в файл, но двигается много файлов в каталоге. shutil.движение будет делать работу, но для ОС этой цели
.переименование-это бесполезно (как указано в комментарии), потому что назначения должны иметь явное имя файла.
На основании ответа описанное здесь, используя подпроцесса` другой вариант.
Что-то вроде этого:
subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)
Мне интересно узнать про's и Кон's данного метода по сравнению с shutil
. Поскольку в моем случае я уже использую подпроцесс
по другим причинам, и это, кажется, работает, я склонен придерживаться его.
Это зависит от системы, может быть?
Это решение, которое не позволяет Шелл
, используя МВ
.
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
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
разных бывших диска. С: --> Д: