1216

我查看了 Pythonos界面,但找不到移动文件的方法。$ mv ...我将如何在 Python 中做相当于?

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

10 回答 10

1850

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

都使用相同的语法:

import os
import shutil

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

请注意,您必须file.foo在源参数和目标参数中都包含文件名 ( )。如果更改,文件将被重命名和移动。

另请注意,在前两种情况下,创建新文件的目录必须已经存在。在 Windows 上,不得存在具有该名称的文件,否则将引发异常,但os.replace()即使在这种情况下也会以静默方式替换文件。

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

于 2012-01-13T22:19:58.390 回答
293

虽然os.rename()shutil.move()都会重命名文件,但最接近 Unix mv 命令的命令是shutil.move(). 不同之处在于,os.rename()如果源和目标位于不同的磁盘上,则不起作用,而shutil.move()文件磁盘不可知。

于 2013-05-30T21:12:13.437 回答
89

Python 3.4 之后,还可以使用pathlib's 类Path来移动文件。

from pathlib import 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

于 2018-10-12T07:39:25.870 回答
41

对于 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 来查看文件夹名称实际上发生了变化。这是将目的地移回源头的shutil。

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

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

现在我们已将文件夹及其文件从源移动到目标并再次返回。

于 2013-02-22T02:30:13.887 回答
25

这是我目前正在使用的:

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 文件,例如,如果您只想移动图像,则使用 pattern '*.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))
于 2016-11-12T19:02:42.983 回答
15

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

于 2016-10-17T14:23:39.883 回答
3

也可以使用 usingsubprocess.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 上工作时可以正常工作。由于没有 mv 命令,Windows 可能会出错。

于 2021-04-19T18:34:11.713 回答
2

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

像这样的东西:

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

我很想知道这种方法与shutil. 因为在我的情况下,我已经subprocess出于其他原因使用它,而且它似乎有效,我倾向于坚持使用它。

这取决于您在其中运行脚本的 shell。该mv命令适用于大多数 Linux shell(bash、sh 等),但也适用于 Windows 上的 Git Bash 等终端。对于其他终端,您必须更改mv为备用命令。

于 2018-06-16T01:50:30.083 回答
0

这是解决方案,它不支持shell使用mv.

from subprocess import Popen, PIPE, STDOUT

source = "path/to/current/file.foo", 
destination = "path/to/new/destination/for/file.foo"

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}")
else:
    print(output)
于 2018-09-12T12:38:22.623 回答
-1
  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:

于 2018-05-07T12:06:57.813 回答