我将如何在 Python 中执行相当于 mv src/* dest/
的操作?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
mv
command 的人,python 的 shutil.move
有一个极端情况,其中 shutil.move
函数不同。 Go here for full write up。 简而言之,当您的目标是一个目录并且该目录已经有一个与源同名的文件时,Python 的 shutil.move
将引发异常(但 gnu-coreutils mv
不会) (再次了解更多信息,请参阅上一句中提供的链接)。
os.system("mv file1 file2")
怎么样?
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
。但是,如果目标位于与源不同的磁盘上,它将改为复制然后删除源文件。
虽然 os.rename()
和 shutil.move()
都会重命名文件,但最接近 Unix mv 命令的命令是 shutil.move()
。不同之处在于,如果源和目标位于不同的磁盘上,os.rename()
将不起作用,而 shutil.move()
与文件磁盘无关。
shutil.move()
使用 os.rename()
。否则,shutil.move()
使用 shutil.copy2()
将源复制到目标,然后删除源。
在 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
Path("path/to/current/file.foo").rename("path/to/new/destination/for/".joinpath(Path.name))
将所有 *.LNK(快捷方式)文件移动到 DUMP 目录。像魅力一样工作! :D
Path("path/to/current/file.foo").rename(Path("path/to/new/destination/for") / Path.name))
对于 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 文件存在。它在那里:)
现在我们已将文件夹及其文件从源移动到目标并再次返回。
这是我目前正在使用的:
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))
os.path.join(parent_path, filename)
而不是字符串连接以避免跨平台问题
接受的答案不是正确的,因为问题不是将文件重命名为文件,而是将许多文件移动到目录中。 shutil.move
将完成这项工作,但出于此目的 os.rename
是无用的(如评论所述),因为目标必须具有明确的文件名。
os.path.basename(my_file_path)
获取文件名,使用 os.path.dirname(my_file_path)
获取文件目录。此外,如果他想移动多个文件,OP 并没有说得很清楚。他在问题中提到只移动一个文件,但他的示例代码暗示移动多个文件。
也可以使用 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 上工作时可以正常工作。由于没有 mv 命令,Windows 可能会出错。
根据答案 described here,使用 subprocess
是另一种选择。
像这样的东西:
subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)
我很想知道这种方法与 shutil
相比的优缺点。由于在我的情况下,我已经出于其他原因使用 subprocess
并且它似乎有效,我倾向于坚持使用它。
这取决于您在其中运行脚本的 shell。mv
命令适用于大多数 Linux shell(bash、sh 等),但也适用于 Windows 上的 Git Bash 等终端。对于其他终端,您必须将 mv
更改为备用命令。
mv
。
这是解决方案,它不使用 mv
启用 shell
。
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)
既然你不关心返回值,你可以做
import os
os.system("mv src/* dest/")
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:
f"{new_path}{f}"
但鉴于您的字符串中没有静态文本,这可能需要更多的工作......我一直在尝试进入虽然习惯使用 f-strings。
shutil.move
适用于目录。可以使用相对路径shutil.move(f.name, "tmp/")
或完整路径shutil.move(f.name, "/Users/hello/tmp/")
,路径中不要使用~
,在python2.7.9,Mac OS X中勾选。~
是一个 shell 结构,与文件路径本身无关,只是作为一个错误的约定。如果您确实想包含您的主目录,请改用os.getenv('HOME')
,如有必要,将其与您所需路径的一部分连接起来。os.path.expanduser()
根据特定于操作系统的规则正确扩展“~
”。由于%HOME%
并不总是在 Windows 上设置,因此更加整洁。os.rename
不会跨不同设备处理文件。如果您不确定源文件和目标文件是否在同一设备上,请使用shutil.move
。