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