作者:小小程序员
链接:https://zhuanlan.zhihu.com/p/91277888
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Python 中有许多“开盖即食”的模块(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在这篇文章中,你将会看到一些用 Python 实现文件复制的特殊方法。下面我们开始学习这九种不同的方法来实现 Python 复制文件操作。
在开始之前,你必须明白为什么了解最适合你的 Python 复制文件方法是如此重要。这是因为文件 I/O 操作属于性能密集型而且经常会达到瓶颈。这就是为什么你应该根据你的应用程序的设计选择最好的方法。
一些共享资源的程序会倾向于以阻塞模式来复制文件,而有些则可能希望以异步方式执行。比如 — 使用线程来复制文件或者启动单独的进程来实现它。还有一点需要考虑的是平台的可移植性。这意味着你应该知道你要运行的程序所在的目标操作系统(Windows/Linux/Mac OS X 等)。
用 Python 复制文件的 9 种方法具体是:

  • shutil copyfile() 方法
  • shutil copy() 方法
  • shutil copyfileobj() 方法
  • shutil copy2() 方法
  • os popen 方法
  • os system() 方法
  • threading Thread() 方法
  • subprocess call() 方法
  • subprocess check_output() 方法

Shutil Copyfile()方法
只有当目标是可写的,这个方法才会将源内容复制到目标位置。如果你没有写入权限,则会导致 IOError 异常。
它会打开输入文件进行读取并忽略其文件类型。接下来,它不会以任何不同的方式处理特殊文件,也不会将它们复制为新的特殊文件。
Copyfile() 方法使用下面的低级函数 copyfileobj()。它将文件名作为参数,打开它们并将文件句柄传递给 copyfileobj()。这个方法中有一个可选的第三个参数,你可用它来指定缓冲区长度。然后它会打开文件并读取指定缓冲区大小的块。但是,默认是一次读取整个文件。

以下是关于 copyfile() 方法的要点。
它将源内容复制到目标文件中。
如果目标文件不可写入,那么复制操作将导致 IOError 异常。
如果源文件和目标文件都相同,它将会返回 SameFileError。
但是,如果目标文件之前有不同的名称,那么该副本将会覆盖其内容。
如果目标是一个目录,这意味着此方法不会复制到目录,那么会发生 Error 13。
它不支持复制诸如字符或块驱动以及管道等文件。

Shutil Copy()方法

copy() 方法的功能类似于 Unix 中的“cp”命令。这意味着如果目标是一个文件夹,那么它将在其中创建一个与源文件具有相同名称(基本名称)的新文件。此外,该方法会在复制源文件的内容后同步目标文件权限到源文件。

copy() vs copyfile() :
copy() 还可以在复制内容时设置权限位,而 copyfile() 只复制数据。
如果目标是目录,则 copy() 将复制文件,而 copyfile() 会失败,出现 Error 13。
有趣的是,copyfile() 方法在实现过程中使用 copyfileobj() 方法,而 copy() 方法则是依次使用 copyfile() 和 copymode() 函数。
在 Potion-3 可以很明显看出 copyfile() 会比 copy() 快一点,因为后者会有一个附加任务(保留权限)。Shutil Copyfileobj()方法
该方法将文件复制到目标路径或者文件对象。如果目标是文件对象,那么你需要在调用 copyfileobj() 之后关闭它。它还假定了一个可选参数(缓冲区大小),你可以用来设置缓冲区长度。这是复制过程中保存在内存中的字节数。系统使用的默认大小是 16KB。

Shutil Copy2()方法
虽然 copy2() 方法的功能类似于 copy()。但是它可以在复制数据时获取元数据中添加的访问和修改时间。复制相同的文件会导致 SameFileError 异常。copy() vs copy2() :
copy() 只能设置权限位,而 copy2() 还可以使用时间戳来更新文件元数据。
copy() 在函数内部调用 copyfile() 和 copymode(), 而 copy2() 是调用 copystat() 来替换copymode()。Os Popen()方法

该方法创建一个发送或者接受命令的管道。它返回一个打开的并且连接管道的文件对象。你可以根据文件打开模式将其用于读取或者写入比如‘r’(默认)或者‘w’。

mode – 它可以是‘r’(默认)或者‘w’
Bufsize – 如果它的值是0,那么就不会出现缓冲。如果将它设置为1,那么在访问文件时就会发生行缓冲。如果你提供一个大于1的值,那么就会在指定缓冲区大小的情况下发生缓冲。但是,对于负值,系统将采用默认缓冲区大小。
对于Windows系统:

对于Liunx系统:

Os System()方法
这是运行任何系统命令的最常用方式。使用 system() 方法,你可以调用 subshell 中的任何命令。在内部,该方法将调用 C 语言的标准库函数。
该方法返回该命令的退出状态。
对于 Windows 系统:

对于 Liunx 系统:

使用异步方式的线程库复制文件
如果你想以异步方式复制文件,那么使用下面的方法。在这里,我们使用 Python 的线程模块在后台进行复制操作。
在使用这种方法时,请确保使用锁定以避免锁死。如果你的应用程序使用多个线程读取/写入文件,就可能会遇到这种情况。

使用Subprocess的Call()方法复制文件
Subprocess 模块提供了一个简单的接口来处理子进程。它让我们能够启动子进程,连接到子进程的输入/输出/错误管道,并检索返回值。
subprocess 模块旨在替换旧版模块和函数,比如 – os.system, os.spawn*, os.popen*, popen2.*
它使用 call() 方法调用系统命令来执行用户任务。

使用 subprocess 中的 Check_output() 方法复制文件
使用 subprocess 中的 Check_output() 方法,你可以运行外部命令或程序并捕获其输出。它也支持管道。

c语言实现将两个文件复制到一个文件里_Python中复制文件的9种方法相关推荐

  1. linux查看usb设备文件,技术|在 Linux 系统里识别 USB 设备名字的 4 种方法

    对于初学者来说,在 Linux 系统里你必须掌握的技术之一就是识别出插入系统里的各种设备.这也许是你的系统硬盘.外部的存储设备或者是可移动设备,比如 USB 设备或 SD 闪存卡等. 现如今,使用 U ...

  2. 在python中对文件操作的一般步骤是_python中对文件的操作

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. python中文件的打开与关闭_python中的文件打开与关闭操作命令介绍

    python中的文件打开与关闭操作命令介绍 1.文件打开与关闭 在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件 open(文件名,访问模式). f = open('t ...

  4. c语言中的全局变量类型,c++全局变量 C/C++中定义全局变量的几种方法及区别

    c语言中全局变量主要是定义在所有函数之外的变量,在程序执行的过程中一直有效,可以被任何函数引用.赋值,想要定义它,一般将其定义在主函数main()之外就行. 例如下面的程序段,变量m就是一个全局变量, ...

  5. android 去重 比较两个list_android 去重 比较两个list_Android 去除list集合中重复项的几种方法...

    因为用到list,要去除重复数据,尝试了几种方法.记录于此... 测试数据: List li1 = new List { "", "", "" ...

  6. android 去重 比较两个list_Android 去除list集合中重复项的几种方法

    因为用到list,要去除重复数据,尝试了几种方法.记录于此... 测试数据: List li1 = new List { "", "", "" ...

  7. 计算机新建文件夹的步骤打开,Win10新建文件夹假死,不要慌!教你这三种方法,轻松应对。...

    原标题:Win10新建文件夹假死,不要慌!教你这三种方法,轻松应对. 使用电脑开启文件夹是我们日常电脑使用过程中,经常会进行操作的事情.而有时我们在使用win10打开文件夹的时候会出现假死的现象,打开 ...

  8. c++语言定义排序函数,关于C++中定义比较函数的三种方法小结

    C++编程优与Pascal的原因之一是C++中存在STL(标准模板库).STL存在很多有用的方法. C++模板库中的许多方法都需要相关参数有序,例如Sort().显然,如果你想对一个集合进行排序,你必 ...

  9. 怎么将svn服务器上的文件彻底删除,如何彻底删除SVN中的文件和文件夹(附恢复方法)...

    这里假设SVN项目的目录为 /data/svn/project,我们想排除trunk/test.exe文件和trunk/notallowed/目录,操作步骤如下及执行的svn命令(在svn安装目录的b ...

最新文章

  1. Windows下MemCache多端口安装配置
  2. 谢尔排序/缩减增量排序(C++)
  3. 皮一皮:如此父母...究竟是好还是不好(沉思)...
  4. python七:编码
  5. OpenMP入门教程
  6. 【Linux】普通用户修改 root 权限文件,没有权限;sudo: 没有终端存在,且未指定 askpass 程序
  7. ubuntu分屏软件_Ubuntu 17.10安装终端分屏:Terminator终端终结者
  8. java面试题一 静态变量
  9. Rust笔记1 rust基本概念
  10. 容器大小_C++复习篇(7)序列式容器vector
  11. matlab绘图基础,matlab绘图基础
  12. keras 升级_如何入门Keras?
  13. 光流(六)--L2范数Horn–Schunck 光流法及应用demo
  14. Java菜鸟教程 基本数据类型(一)
  15. kafka详细安装运行
  16. Vue3源码解析04--响应式核心effect
  17. 2018 AFCTF 可怜的RSA
  18. 2020放弃安卓用鸿蒙,放弃鸿蒙用安卓,认输就在一念之间,网友13亿人养不起华为...
  19. 组装一台计算机的配置,2000元组装一台i7迷你主机电脑配置推荐
  20. 一些有启发的段子【来自一位弱小的PM】

热门文章

  1. [k8s] 第四章 kubectl 命令行 实战入门
  2. 5.Spring Security 短信验证码登录
  3. android Camera照相机技术(一)
  4. PHP设计模式之装饰模式(Decorator)
  5. android qq三方登录授权失败,QQ第三方登陆授权失败110401原因及解决办法分享
  6. ipmi重启_重启ipmi服务器
  7. php读取文件内容不全,php读取文件内容的三种方法
  8. java 反射机制_Java反射机制原理探究
  9. 计算机全球服务器,云计算的宿命:全球合并成一台计算机,支持无服务器运行...
  10. java web 打印控件_web打印,web打印控件,dotnet web打印控件,java web打印控件,webprint...