如何在 Python 中移动文件?

2024-11-27 10:43:00
admin
原创
14
摘要:问题描述:我怎样才能在 Python 中做到等效的事情mv?mv "path/to/current/file.foo" "path/to/new/destination/for/file.foo" 解决方案 1:os.rename(),os.replace(), 或者s...

问题描述:

我怎样才能在 Python 中做到等效的事情mv

mv "path/to/current/file.foo" "path/to/new/destination/for/file.foo"

解决方案 1:

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。但是,如果目标与源位于不同的磁盘上,它将复制然后删除源文件。

解决方案 2:

尽管os.rename()shutil.move()都可以重命名文件,但最接近 Unix mv 命令的命令是shutil.move()。 不同之处在于,os.rename()如果源和目标位于不同的磁盘上, 则不起作用,而 则shutil.move()文件与磁盘无关。

解决方案 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:

对于或os.renameshutil.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
>>> source = '/opt/awesome/destination' 
>>> destination = '/opt/awesome/source'
>>> shutil.move(source, destination)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']

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

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

解决方案 5:

这是我目前正在使用的:

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)

您还可以将其转换为一个函数,该函数接受源目录和目标目录,如果目标文件夹不存在,则创建目标文件夹,然后移动文件。还允许过滤源文件,例如,如果您只想移动图像,则使用模式'*.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))

解决方案 6:

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

解决方案 7:

由于您不关心返回值,因此您可以这样做

import os
os.system("mv src/* dest/")

解决方案 8:

使用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 上工作时,此方法可行。Windows 可能会出错,因为没有 mv 命令。

解决方案 9:

这是解决方案,但无法shell使用mv

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)

解决方案 10:

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

像这样:

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

我很好奇,想知道与 相比,这种方法的优缺点shutil。由于我的情况是,我已经subprocess出于其他原因使用了这种方法,而且它似乎有效,所以我倾向于坚持使用它。

这取决于您运行脚本的 shell。该mv命令适用于大多数 Linux shell(bash、sh 等),但也可以在 Windows 上的 Git Bash 等终端中使用。对于其他终端,您必须更改mv为备用命令。

解决方案 11:

  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:

解决方案 12:

使用 django 中的内置包进行文件操作

导入这个包

import shutil

使用以下代码将文件从一个目录移动到另一个目录

 file = Path(output_file)
 converted_file = 'media/streamdataconverted/'+file.name
 shutil.move(file, converted_file)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   649  
  如何借鉴华为IPD体系优化企业研发?在当今竞争激烈的市场环境中,企业要想保持技术领先和产品竞争力,必须拥有一套高效且严谨的研发管理体系。华为作为全球领先的ICT解决方案提供商,其集成产品开发(IPD, Integrated Product Development)体系与质量管理体系(如ISO 9000系列)的融合实践,...
IPD项目管理   0  
  IPD流程图的7种经典绘制方法详解在产品开发领域,集成产品开发(Integrated Product Development,简称IPD)流程被广泛应用,以提高产品开发的效率和质量。IPD流程图作为这一流程的可视化工具,其绘制方法至关重要。本文将详细介绍七种经典的IPD流程图绘制方法,帮助项目管理人员和团队更好地理解和...
IPD研发管理体系   0  
  IPD流程:企业创新管理的核心引擎在当今快速变化的市场环境中,企业要想持续保持竞争力,就必须不断进行创新。而IPD(Integrated Product Development,集成产品开发)流程作为一种先进的产品开发管理模式,正逐渐成为众多企业提升创新能力、加速产品上市速度、降低开发成本的重要选择。本文将深入探讨IP...
IPD管理   0  
  IPD流程与传统产品开发流程的概述在产品开发领域,企业不断寻求高效、系统的管理方法以确保产品能够顺利从概念转化为市场成功的产品。集成产品开发(Integrated Product Development,简称IPD)流程与传统产品开发流程是两种截然不同的管理理念和方法。传统产品开发流程往往以职能部门为核心,各部门按顺序...
IPD流程中PDCP是什么意思   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用