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(source_file, destination_file)

以下是关于 copyfile() 方法的要点。

它将源内容复制到目标文件中。

如果目标文件不可写入,那么复制操作将导致 IOError 异常。

如果源文件和目标文件都相同,它将会返回 SameFileError。

但是,如果目标文件之前有不同的名称,那么该副本将会覆盖其内容。

如果目标是一个目录,这意味着此方法不会复制到目录,那么会发生 Error 13。

它不支持复制诸如字符或块驱动以及管道等文件。

# Python Copy File - Sample Code

from shutil import copyfile

from sys import exit

source = input("Enter source file with full path: ")

target = input("Enter target file with full path: ")

# adding exception handling

try:

copyfile(source, target)

except IOError as e:

print("Unable to copy file.%s" % e)

exit(1)

except:

print("Unexpected error:", sys.exc_info())

exit(1)

print("\nFile copy done!\n")

while True:

print("Do you like to print the file ? (y/n): ")

check = input()

if check == 'n':

break

elif check == 'y':

file = open(target, "r")

print("\nHere follows the file content:\n")

print(file.read())

file.close()

print()

break

else:

Continue

Shutil Copy()方法

copyfile(source_file, [destination_file or dest_dir])

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

import os

import shutil

source = 'current/test/test.py'

target = '/prod/new'

assert not os.path.isabs(source)

target = os.path.join(target, os.path.dirname(source))

# create the folders if not already exists

os.makedirs(target)

# adding exception handling

try:

shutil.copy(source, target)

except IOError as e:

print("Unable to copy file.%s" % e)

except:

print("Unexpected error:", sys.exc_info())

copy() vs copyfile() :

copy() 还可以在复制内容时设置权限位,而 copyfile() 只复制数据。

如果目标是目录,则 copy() 将复制文件,而 copyfile() 会失败,出现 Error 13。

有趣的是,copyfile() 方法在实现过程中使用 copyfileobj() 方法,而 copy() 方法则是依次使用 copyfile() 和 copymode() 函数。

在 Potion-3 可以很明显看出 copyfile() 会比 copy() 快一点,因为后者会有一个附加任务(保留权限)。

Shutil Copyfileobj()方法

该方法将文件复制到目标路径或者文件对象。如果目标是文件对象,那么你需要在调用 copyfileobj() 之后关闭它。它还假定了一个可选参数(缓冲区大小),你可以用来设置缓冲区长度。这是复制过程中保存在内存中的字节数。系统使用的默认大小是 16KB。

from shutil import copyfileobj

status = False

if isinstance(target, string_types):

target = open(target, 'wb')

status = True

try:

copyfileobj(self.stream, target, buffer_size)

finally:

if status:

target.close()

Shutil Copy2()方法

虽然 copy2() 方法的功能类似于 copy()。但是它可以在复制数据时获取元数据中添加的访问和修改时间。复制相同的文件会导致 SameFileError 异常。

from shutil import *

import os

import time

from os.path import basename

def displayFileStats(filename):

file_stats = os.stat(basename(filename))

print('\tMode :', file_stats.st_mode)

print('\tCreated :', time.ctime(file_stats.st_ctime))

print('\tAccessed:', time.ctime(file_stats.st_atime))

print('\tModified:', time.ctime(file_stats.st_mtime))

os.mkdir('test')

print('SOURCE:')

displayFileStats(__file__)

copy2(__file__, 'testfile')

print('TARGET:')

displayFileStats(os.path.realpath(os.getcwd() + '/test/testfile'))

copy() vs copy2() :

copy() 只能设置权限位,而 copy2() 还可以使用时间戳来更新文件元数据。

copy() 在函数内部调用 copyfile() 和 copymode(), 而 copy2() 是调用 copystat() 来替换copymode()。

Os Popen()方法

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

os.popen(command[, mode[, bufsize]])

mode – 它可以是‘r’(默认)或者‘w’

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

对于Windows系统:

import os

os.popen('copy 1.txt.py 2.txt.py')

对于Liunx系统:

import os

os.popen('cp 1.txt.py 2.txt.py')

Os System()方法

这是运行任何系统命令的最常用方式。使用 system() 方法,你可以调用 subshell 中的任何命令。在内部,该方法将调用 C 语言的标准库函数。

该方法返回该命令的退出状态。

对于 Windows 系统:

import os

os.system('copy 1.txt.py 2.txt.py')

对于 Liunx 系统:

import os

os.system('cp 1.txt.py 2.txt.py')

使用异步方式的线程库复制文件

如果你想以异步方式复制文件,那么使用下面的方法。在这里,我们使用 Python 的线程模块在后台进行复制操作。

在使用这种方法时,请确保使用锁定以避免锁死。如果你的应用程序使用多个线程读取/写入文件,就可能会遇到这种情况。

import shutil

from threading import Thread

src="1.txt.py"

dst="3.txt.py"

Thread(target=shutil.copy, args=[src, dst]).start()

使用Subprocess的Call()方法复制文件

Subprocess 模块提供了一个简单的接口来处理子进程。它让我们能够启动子进程,连接到子进程的输入/输出/错误管道,并检索返回值。

subprocess 模块旨在替换旧版模块和函数,比如 – os.system, os.spawn*, os.popen*, popen2.*

它使用 call() 方法调用系统命令来执行用户任务。

import subprocess

src="1.txt.py"

dst="2.txt.py"

cmd='copy "%s" "%s"' % (src, dst)

status = subprocess.call(cmd, shell=True)

if status != 0:

if status < 0:

print("Killed by signal", status)

else:

print("Command failed with return code - ", status)

else:

print('Execution of%spassed!\n' % cmd)

使用 subprocess 中的 Check_output() 方法复制文件

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

import os, subprocess

src=os.path.realpath(os.getcwd() + "http://cdn.techbeamers.com/1.txt.py")

dst=os.path.realpath(os.getcwd() + "http://cdn.techbeamers.com/2.txt.py")

cmd='copy "%s" "%s"' % (src, dst)

status = subprocess.check_output(['copy', src, dst], shell=True)

print("status: ", status.decode('utf-8'))

想了解更多 Python 姿势?快来集智主站:集智专栏​jizhi.im

python中shutil.copyfile的用法_用Python复制文件的9个方法相关推荐

  1. python中shutil.copyfile的用法_Python shutil.copyfile()用法及代码示例

    Python中的Shutil模块提供了许多对文件和文件集合进行高级操作的功能.它属于Python的标准实用程序模块.此模块有助于自动执行文件和目录的复制和删除过程. shutil.copyfile() ...

  2. python中shutil.copyfile的用法_python模块之shutil

    shutil模块提供了一些针对文件和目录的高级操作,主要是拷贝.移动.对于单个文件的操作,还可参考os模块 Warning:即使是高级别的拷贝函数(shutil.copy(),shutil.copy2 ...

  3. python中seek函数的用法_在Python中操作文件之seek()方法的使用教程

    seek()方法在偏移设定该文件的当前位置.参数是可选的,默认为0,这意味着绝对的文件定位,它的值如果是1,这意味着寻求相对于当前位置,2表示相对于文件的末尾. 没有返回值.需要注意的是,如果该文件被 ...

  4. python中if else语句用法_讲解Python中if语句的嵌套用法

    可能有这样一种情况,当你想检查其他条件后一个条件解析为真.在这种情况下,可以使用嵌套的if结构. 在嵌套的 if 语句结构,可以在一个 if... elif... else 结构里面可有另外一个 if ...

  5. python中while true的用法_解析Python中while true的使用

    无限循环 如果条件判断语句永远为 true,循环将会无限的执行下去,如下实例: #!/usr/bin/python # -*- coding: UTF-8 -*- var = 1 while var ...

  6. python中shutil模块的用法_python中的os,shutil模块的定义以及用法

    #os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为'\\'os.name 字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Unix用户 ...

  7. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  8. python中for语句的使用_对Python中for复合语句的使用示例讲解

    当Python中用到双重for循环设计的时候我一般会使用循环的嵌套,但是在Python中其实还存在另一种技巧--for复合语句. 简单写一个小程序,用于延时循环嵌套功能如下: #!/usr/bin/p ...

  9. python中shutil模块的用法-高级文件操作模块

    目录 前言 一.shutil是什么? 二.使用步骤 1. 安装shutil库 2. shutil库的使用 3. 复制函数 3.1 shutil.copy(src,dst) ==> 拷贝文件和权限 ...

最新文章

  1. # NVIDIA Jetson系列系统镜像备份烧录指南
  2. pep8 python 编码规范_「原创」「python自学笔记」python编码规范
  3. Linux命令之tree
  4. 【转载】ssdb安装部署
  5. 基于javaweb(springboot+mybatis)宠物医院预约管理系统设计和实现以及论文报告
  6. Markdown语法--整理
  7. [设计模式-行为型]解释器模式(Interpreter)
  8. hbaseRowkey设计
  9. “达观杯”文本智能处理冠军分享:深度学习文本分类
  10. react页面内嵌微信二维码 和 自定义样式 以及 微信网页共用unionId问题
  11. Spring Boot (一)快速入门
  12. 计算机会计报表管理,职称计算机考试用友财务教程:会计报表子系统的主要功能...
  13. maxon电机驱动简介
  14. linux下无线USB网卡驱动安装
  15. 关于js中new Date()的bugger发现
  16. excel计算加权平均方法
  17. MayaToUE4之影视动画制作流程
  18. Invalid bound statement (not found): com.itheima.mapper.userMapper.SelectAll
  19. python读取文件并复制文件
  20. 阿里巴巴java开发规范手册

热门文章

  1. 002_Delphi版本的选择?
  2. 心率变异性 matlab,心率变异性好的功率谱分析方面的问题
  3. gradle自定义plugin实践之360多渠道加固打包
  4. 一年代码功能点的创新性怎么写_论文的创新点怎么写?
  5. iOS 探讨之 CADisplayLink
  6. python图片镜像翻转_翻转图像/镜像图像
  7. 安卓ImageView镜像翻转
  8. SpringBoot整合SpringDataRedis,java学习视频百度云
  9. CentOS 7安装XWiki
  10. 符号主义与机器学习的认知问题