Как переместить файл в Python



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



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

9 ответов:

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() не имеет значения, на каком диске находятся файлы.

для любой ОС.переименовать или шутил.переместить вам нужно будет импортировать модуль. Для перемещения всех файлов не требуется символ*.

у нас есть папка в /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

    Ничего не найдено.