如何在Python中移动一个文件

我研究了Python os 接口,但无法找到移动文件的方法。我如何在Python中做相当于`$ mv ...'的事情?

>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
对该问题的评论 (2)
解决办法

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。然而,如果目的地与源文件在不同的磁盘上,它将复制然后删除源文件。

评论(8)

尽管os.rename()shutil.move()都可以重命名文件,但最接近Unix mv命令的命令是shutil.move()。 区别在于,如果源文件和目标文件在不同的磁盘上,os.rename()就不工作,而shutil.move()则不关心文件在什么磁盘上。

评论(3)

对于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文件存在。 它就在那里 :)

现在我们已经把一个文件夹和它的文件从源文件移到了目的地,然后再移回来。

评论(2)

在Python 3.4之后,你也可以使用pathlib'的类Path来移动文件。

Path("path/to/current/file.foo").rename("path/to/new/estination/for/file.foo")

https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename

评论(1)

这是我目前正在使用的。

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))
评论(1)

被接受的答案不是正确的,因为问题不是关于将一个文件重命名为一个文件,而是将许多文件移动到一个目录。 shutil.move可以做到这一点,但对于这个目的来说,os.rename是无用的(如评论中所说),因为目的地必须有一个明确的文件名。

评论(1)

根据[这里][1]的答案,使用 "子进程 "是另一种选择。

类似这样。

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

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

也许是系统的问题?

[1]: https://stackoverflow.com/questions/21804935/how-to-use-the-mv-command-in-python-with-subprocess

评论(0)

这是一个解决方案,它不能使用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

[1]: https://unix.stackexchange.com/a/43998/198423

评论(0)
  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 

不同的盘面ex.C:-->D.

评论(1)