如何在Python中移动文件?

如何在Python中执行相当于mv src/* dest/的操作?

>>> source_files = '/PATH/TO/FOLDER/*'>>> destination_folder = 'PATH/TO/FOLDER'>>> # equivalent of $ mv source_files destination_folder
1661683 次浏览

#0#1#2

都使用相同的语法:

import osimport 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。但是,如果目标位于与源不同的磁盘上,它将改为复制然后删除源文件。

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

我们有一个名为source /opt/awesome文件夹,其中一个文件名为awesome.txt.

in /opt/awesome○ → lssource○ → ls sourceawesome.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文件存在。

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

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

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

这是我目前正在使用的:

import os, shutilpath = "/volume1/Users/Transfer/"moveto = "/volume1/Users/Drive_Transfer/"files = os.listdir(path)files.sort()for f in files:src = path+fdst = moveto+fshutil.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))
  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:

基于答案这里描述,使用subprocess是另一种选择。

像这样的东西:

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

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

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

这是解决方案,它不启用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)

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

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

既然你不关心返回值,你可以这样做

import osos.system("mv src/* dest/")