如何在Python中移动文件

How to move a file in Python

我查看了python os接口,但找不到移动文件的方法。在python中,我如何实现与$ mv ...的等效性?

1
2
3
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder


os.rename()shutil.move()

两者使用相同的语法:

1
2
3
4
5
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()不关心文件在哪个磁盘上。


对于os.rename或shutil.move,您需要导入模块。不需要*字符来移动所有文件。

我们在/opt/awome有一个名为source的文件夹,其中有一个名为awome.txt的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
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来查看文件夹名称是否发生了变化。这是把目的地移回源头的航天飞机。

1
2
3
4
>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']

这次我检查了源文件夹,以确保我创建的awesome.txt文件存在。它在那里:

现在,我们已经将一个文件夹及其文件从源位置移到目标位置,然后再移回来。


接受的答案不是正确的答案,因为问题不是将文件重命名为文件,而是将许多文件移动到一个目录中。shutil.move将完成这项工作,但为此目的,os.rename是无用的(如注释所述),因为目的地必须有一个明确的文件名。


这是我目前正在使用的:

1
2
3
4
5
6
7
8
9
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',默认情况下,它会移动目录中的所有内容。

1
2
3
4
5
6
7
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))


在python 3.4之后,还可以使用pathlib的类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


根据这里描述的答案,使用subprocess是另一种选择。

像这样:

1
subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)

shutil相比,我很想知道这种方法的优点和缺点。因为在我的例子中,我已经出于其他原因使用了subprocess,而且它似乎有效,所以我倾向于坚持使用它。

是否依赖于系统?


这是一种解决方案,它不支持使用mvshell

1
2
3
4
5
6
7
8
9
10
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

1
2
3
4
5
6
7
8
9
10
11
12
  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: