Как переместить файл в Python
Я заглянул в питона os
интерфейс, но не смог найти метод для перемещения файла. Как бы я сделал эквивалент $ mv ...
в питоне?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
11 ответов
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
в большинстве случаев. Однако если место назначения находится на диске, отличном от исходного, вместо этого он скопирует и затем удалит исходный файл.
Хотя os.rename()
а также shutil.move()
будут оба переименовывать файлы, команда, которая ближе всего к команде Unix mv shutil.move()
, Разница в том, что os.rename()
не работает, если источник и место назначения находятся на разных дисках, в то время как shutil.move()
не волнует, на каком диске находятся файлы.
После Python 3.4 вы также можете использовать pathlib
класс Path
переместить файл.
Path("path/to/current/file.foo").rename("path/to/new/destination/for/file.foo")
Для 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 существует. Это там:)
Теперь мы переместили папку и ее файлы из источника в место назначения и обратно.
Это то, что я использую в данный момент:
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)
Теперь полностью функциональный. Надеюсь, это поможет вам.
Принятый ответ не является правильным, потому что вопрос не в переименовании файла в файл, а в перемещении многих файлов в каталог. shutil.move
сделаю работу, но для этого os.rename
бесполезен (как указано в комментариях), потому что у места назначения должно быть явное имя файла.
Поскольку вам все равно на возвращаемое значение, вы можете сделать
import os
os.system("mv src/* dest/")
Также возможно с использованием
subprocess.run()
метод.
python:
>>> import subprocess
>>> new = "/path/to/destination"
>>> old = "/path/to/new/destination"
>>> process = "mv ..{} ..{}".format(old,new)
>>> subprocess.run(process, shell=True) # do not remember, assign shell value to True.
Это будет нормально работать в Linux. Windows, вероятно, выдает ошибку, поскольку нет команды mv.
Основываясь на ответе, описанном здесь, используя subprocess
это еще один вариант.
Что-то вроде этого:
subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)
Мне любопытно узнать "за" и "против" этого метода по сравнению с shutil
, Так как в моем случае я уже использую subprocess
по другим причинам и, кажется, работает, я склонен придерживаться этого.
Это зависит от системы, может быть?
Это решение, которое не позволяет 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
другой диск отл. C: -> D: