How to move a file?

Posted on

Solving problem is about exposing yourself to as many situations as possible like How to move a file? and practice these strategies over and over. With time, it becomes second nature and a natural way you approach any problems in general. Big or small, always start with a plan, use other strategies mentioned here till you are confident and ready to code the solution.
In this post, my aim is to share an overview the topic about How to move a file?, which can be followed any time. Take easy to follow this discuss.

How to move a file?

I looked into the Python os interface, but was unable to locate a method to move a file. How would I do the equivalent of $ mv ... in Python?

>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
Asked By: David542


Answer #1:

os.rename(), shutil.move(), or os.replace()

All employ the same syntax:

import os
import shutil
os.rename("path/to/current/", "path/to/new/destination/for/")
shutil.move("path/to/current/", "path/to/new/destination/for/")
os.replace("path/to/current/", "path/to/new/destination/for/")

Note that you must include the file name ( in both the source and destination arguments. If it is changed, the file will be renamed as well as moved.

Note also that in the first two cases the directory in which the new file is being created must already exist. On Windows, a file with that name must not exist or an exception will be raised, but os.replace() will silently replace a file even in that occurrence.

As has been noted in comments on other answers, shutil.move simply calls os.rename in most cases. However, if the destination is on a different disk than the source, it will instead copy and then delete the source file.

Answered By: ig0774

Answer #2:

Although os.rename() and shutil.move() will both rename files, the command that is closest to the Unix mv command is shutil.move(). The difference is that os.rename() doesn’t work if the source and destination are on different disks, while shutil.move() doesn’t care what disk the files are on.

Answered By: Jim Calfas

Answer #3:

After Python 3.4, you can also use pathlib‘s class Path to move file.

from pathlib import Path

Answered By: MoonFruit

Answer #4:

For either the os.rename or shutil.move you will need to import the module.
No * character is necessary to get all the files moved.

We have a folder at /opt/awesome called source with one file named awesome.txt.

in /opt/awesome
? ? ls
? ? ls source
>>> source = '/opt/awesome/source'
>>> destination = '/opt/awesome/destination'
>>> import os
>>> os.rename(source, destination)
>>> os.listdir('/opt/awesome')

We used os.listdir to see that the folder name in fact changed.
Here’s the shutil moving the destination back to source.

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

This time I checked inside the source folder to be sure the awesome.txt file I created exists. It is there 🙂

Now we have moved a folder and its files from a source to a destination and back again.

Answered By: jmontross

Answer #5:

This is what I’m using at the moment:

import os, shutil
path = "/volume1/Users/Transfer/"
moveto = "/volume1/Users/Drive_Transfer/"
files = os.listdir(path)
for f in files:
    src = path+f
    dst = moveto+f

Now fully functional. Hope this helps you.


I’ve turned this into a function, that accepts a source and destination directory, making the destination folder if it doesn’t exist, and moves the files. Also allows for filtering of the src files, for example if you only want to move images, then you use the pattern '*.jpg', by default, it moves everything in the directory

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))
Answered By: Peter Vlaar

Answer #6:

The accepted answer is not the right one, because the question is not about renaming a file into a file, but moving many files into a directory. shutil.move will do the work, but for this purpose os.rename is useless (as stated on comments) because destination must have an explicit file name.

Answered By: Javier Palacios

Answer #7:

Based on the answer described here, using subprocess is another option.

Something like this:"mv %s %s" % (source_files, destination_folder), shell=True)

I am curious to know the pro’s and con’s of this method compared to shutil. Since in my case I am already using subprocess for other reasons and it seems to work I am inclined to stick with it.

Is it system dependent maybe?

Answered By: Bill

Answer #8:

This is solution, which does not enables shell using mv.

from subprocess import Popen, PIPE, STDOUT
source = "path/to/current/",
destination = "path/to/new/destination/for/"
p = Popen(["mv", "-v", source, destination], stdout=PIPE, stderr=STDOUT)
output, _ = p.communicate()
output = output.strip().decode("utf-8")
if p.returncode:
    print(f"E: {output}")
Answered By: alper

Leave a Reply

Your email address will not be published.