如何在Python中移动文件

Dav*_*542 811 python file file-handling

我查看了Python os界面,但无法找到移动文件的方法.我如何$ mv ...在Python中完成相同的操作?

>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
Run Code Online (Sandbox Code Playgroud)

ig0*_*774 1172

os.rename() 要么 shutil.move()

两者都使用相同的语法:

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")
Run Code Online (Sandbox Code Playgroud)

请注意,在这两种情况下,创建新文件的目录必须已存在(但是,在Windows上,具有该名称的文件不得存在,否则将引发异常).另请注意,您必须os.replace()在源和目标参数中包含文件名().如果更改,则文件将被重命名以及移动.

正如在其他答案的评论中所指出的那样,在大多数情况下file.foo只需拨打电话os.replace().但是,如果目标位于与源不同的磁盘上,则它将复制然后删除源文件.

  • `shutil.move`适用于目录.你可以使用相对路径`shutil.move(f.name,"tmp /")`或完整路径`shutil.move(f.name,"/ Users/hello/tmp /")`,**不要使用****`~`**在路径中,在python2.7.9,Mac OS X中检查. (26认同)
  • 您可以随时使用`os.path.expanduser()`根据特定于操作系统的规则正确扩展'`~`'.由于`%HOME%`并不总是在Windows上设置,所以更整洁. (12认同)
  • `os.rename`不会处理不同设备上的文件.如果您不确定源文件和目标文件是否在同一设备上,请使用`shutil.move`. (12认同)
  • 我是唯一认为os.rename不适用于目录的人吗?我引用:"如果dst是一个目录,将引发OSError." (8认同)
  • `~`是一个shell构造,与文件路径本身无关,除了错误的约定.如果你真的想涉及你的主目录,请使用`os.getenv('HOME')`,如果需要,将它与你想要的路径的部分连接起来. (3认同)

小智 227

虽然os.rename()并且shutil.move()都将重命名文件,但最接近Unix mv命令的命令是shutil.move().不同之处在于,os.rename()如果源和目标位于不同的磁盘上,则shutil.move()不起作用,而不关心文件所在的磁盘.

  • `shutil.move()`如果目标在当前文件系统上,则使用`os.rename()`.否则,`shutil.move()`使用`shutil.copy2()`将源复制到目标,然后删除源. (69认同)
  • 请注意:如果目标已存在,则Python 2.7.3中的shutil.move会失败.因此,如果可能,请捕获错误,或手动删除文件/目录,然后执行移动. (9认同)
  • 注意意识到[`shutil.copy2()`无法复制所有文件元数据](https://docs.python.org/2/library/shutil.html),所以如果发生这种情况就像在做`cp -p`然后`rm`,我收集. (8认同)

jmo*_*oss 32

对于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']
Run Code Online (Sandbox Code Playgroud)

我们使用os.listdir来查看文件夹名称实际上已更改.这是shutil将目的地移回源头.

>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
Run Code Online (Sandbox Code Playgroud)

这次我检查了源文件夹,确保我创建的awesome.txt文件存在.它在那里:)

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

  • http://docs.python.org/2/library/shutil.html此文档显示您已为shutil.move方法切换参数. (4认同)
  • 我使用了反向的目标和源来查看文件从源移动然后返回到它......我可以看出这是多么不清楚。 (2认同)

Moo*_*uit 18

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

小智 11

这就是我现在正在使用的:

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)
Run Code Online (Sandbox Code Playgroud)

现在功能齐全.希望这对你有所帮助.

  • 您可以使用 fnmatch.filter() 轻松地将其转换为过滤移动,请参阅我的编辑。另外,最好使用 os.path.join(parent_path, filename) 而不是字符串连接,以避免跨平台问题 (3认同)

Jav*_*ios 10

接受的答案不正确,因为问题不是将文件重命名为文件,而是将许多文件移动到目录中.shutil.move将完成工作,但为此目的os.rename是无用的(如评论中所述)因为目的地必须具有明确的文件名.