如何在 Python 中移动文件

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

答案

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

全部采用相同的语法:

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")
os.replace("path/to/current/file.foo", "path/to/new/destination/for/file.foo")

请注意,您必须在源参数和目标参数中都包含文件名( file.foo )。如果更改,该文件将被重命名和移动。另请注意,在前两种情况下,用于创建新文件的目录必须已经存在。在 Windows 上,必须不存在具有该名称的文件,否则将引发异常,但是os.replace()会静默替换该文件,即使在这种情况下也是如此。

正如在其他答案的评论所指出, shutil.move简单的调用os.rename在大多数情况下。但是,如果目标与源位于不同的磁盘上,它将复制并删除源文件。

尽管os.rename()shutil.move()都将重命名文件,但是最接近 Unix mv 命令的命令是shutil.move() 。不同的是, os.rename()不工作,如果源和目标是不同的磁盘上,而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']

我们使用 os.listdir 来查看文件夹名称实际上已更改。这是将目的地移回源头的阴影。

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

这次,我在源文件夹中进行了检查,以确保创建的 awesome.txt 文件存在。在那儿:)

现在,我们已经将文件夹及其文件从源移动到了目的地,然后又移回了。

在 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

这是我目前正在使用的:

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' ,默认情况下,它将移动目录中的所有内容

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))

接受的答案不是正确的答案,因为问题不在于将文件重命名为文件,而是将许多文件移动到目录中。 shutil.move可以完成工作,但是为此, os.rename是无用的(如注释中所述),因为目标必须具有显式文件名。

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

像这样:

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

我很想知道这种方法相对于shutil 。因为就我而言,由于其他原因我已经在使用subprocess ,并且它似乎可以正常工作,所以我倾向于坚持使用它。

可能取决于系统吗?

这是解决方案,不能使用mv启用shell

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: