如何移动文件?

问题描述 投票:902回答:9

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

>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
python file file-handling
9个回答
1355
投票

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 在大多数情况下,它都会先复制然后再删除源文件。但是,如果目标文件与源文件在不同的磁盘上,它将复制然后删除源文件。


246
投票

虽然 os.rename()shutil.move() 都会重命名文件,最接近Unix mv命令的命令是 shutil.move(). 不同的是 os.rename() 如果源盘和目标盘在不同的磁盘上,则不工作,而 shutil.move() 并不关心文件在哪个磁盘上。


38
投票

无论是os.rename还是shutil.move,你都需要导入模块。不需要*字符就可以把所有的文件都移动。

我们在 optawesome 有一个名为 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把目的文件夹移回source的过程。

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

这次我检查了source文件夹,以确定我创建的awesome.txt文件是否存在。 它是存在的:)

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


36
投票

在 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.org3.4librarypathlib.html#pathlib.Path.rename。


18
投票

这是我目前正在使用的。

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))

12
投票

公认的答案是不正确的,因为这个问题不是把一个文件改名成一个文件,而是把很多文件移到一个目录里。shutil.move 会做的工作,但对于这个目的 os.rename 是无用的(如注释中所述),因为目标文件必须有一个明确的文件名。


3
投票

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

类似这样的方法。

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

我很想知道这个方法的优缺点,与之相比 shutil. 因为在我的情况下,我已经使用了 subprocess 由于其他原因,而且它似乎可以工作,我倾向于坚持使用它。

也许它是依赖于系统?


1
投票

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

import subprocess

source      = 'pathToCurrent/file.foo'
destination = 'pathToNew/file.foo'

p = subprocess.Popen(['mv', source, destination], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = p.communicate()[0].decode('utf-8').strip()

if p.returncode:
    print(f"E:{output}")

-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:. C:--> D.

© www.soinside.com 2019 - 2024. All rights reserved.