问题:如何移动文件?
我查看了Python $ mv ...
在Python中做相当于?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
回答 0
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
。但是,如果目标与源位于不同的磁盘上,它将代替复制然后删除源文件。
回答 1
尽管os.rename()
并且shutil.move()
都将重命名文件,但是最接近Unix mv命令的命令是shutil.move()
。区别在于,os.rename()
如果源和目标位于不同的磁盘上,则shutil.move()
不起作用,而与文件所在的磁盘无关。
回答 2
对于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文件存在。在那儿:)
现在,我们已经将文件夹及其文件从源移动到了目的地,然后又移回了。
回答 3
在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
回答 4
这是我目前正在使用的:
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))
回答 5
可接受的答案不是正确的答案,因为问题不在于将文件重命名为文件,而是将许多文件移动到目录中。shutil.move
会完成这项工作,但是为此目的os.rename
是没有用的(如注释中所述),因为目标必须具有明确的文件名。
回答 6
根据此处描述的答案,使用subprocess
是另一种选择。
像这样:
subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)
与相比,我很想知道这种方法的优缺点shutil
。因为就我而言,我已经subprocess
出于其他原因使用了它,并且似乎可以使用,所以我倾向于坚持使用它。
可能取决于系统吗?
回答 7
这是解决方案,无法shell
使用mv
。
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
回答 8
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: