0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何实现Python复制文件操作

马哥Linux运维 来源:博客园 2024-07-18 14:53 次阅读

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("
File copy done!
")

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("
Here follows the file content:
")
       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 异常。

copy() vs copy2() :

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

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

Os Popen()方法

from shutil import *
import os 
import time
from os.path import basename

def displayFileStats(filename):
   file_stats = os.stat(basename(filename))
   print('	Mode    :', file_stats.st_mode)
   print('	Created :', time.ctime(file_stats.st_ctime))
   print('	Accessed:', time.ctime(file_stats.st_atime))
   print('	Modified:', 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'))

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

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

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

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

对于Windows系统:

import os
os.popen('copy //www.obk20.com/images/chaijie_default.png 2.txt.py')

对于Liunx系统:

import os
os.popen('cp //www.obk20.com/images/chaijie_default.png 2.txt.py')

Os System()方法

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

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

对于 Windows 系统:

import os
os.system('copy //www.obk20.com/images/chaijie_default.png 2.txt.py') 

对于 Liunx 系统:

import os
os.system('cp //www.obk20.com/images/chaijie_default.png 2.txt.py')

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

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

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

import shutil
from threading import Thread

src="//www.obk20.com/images/chaijie_default.png"
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="//www.obk20.com/images/chaijie_default.png"
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 %s passed!
' % cmd)

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

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

import os, subprocess

src=os.path.realpath(os.getcwd() + "http://cdn.techbeamers.com///www.obk20.com/images/chaijie_default.png")
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'))

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11296

    浏览量

    209354
  • 文件
    +关注

    关注

    1

    文章

    565

    浏览量

    24732
  • python
    +关注

    关注

    56

    文章

    4793

    浏览量

    84631

原文标题:用Python复制文件的9个方法

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    python学习--文件操作

    进入第7天的学习,学到了python文件操作,教程说是和C语言兼容,于是就迫不及待的的想试试。按照教程的输入,直接改成自己的目录f=open('D:\python\text.txt'
    发表于 12-25 16:41

    labview 如何实现复制文件的同时获取复制进度

    如何实现复制文件的同时获取复制进度哪位大侠实现了,麻烦指点下,谢谢!
    发表于 12-27 15:12

    请问python文件怎么操作

    python文件操作步骤
    发表于 11-16 07:53

    C语言-文件操作

    在应用程序中,经常需要用文件来保存数据,这就要用到文件的输入/输出操作。本章主要介绍和文件相关的类,以及目录、文件
    发表于 04-23 11:11 13次下载

    linux中复制文件的方法

     linux中如何复制文件
    发表于 06-03 09:17 2231次阅读
    linux中<b class='flag-5'>复制</b><b class='flag-5'>文件</b>的方法

    使用Python复制文件的方法有哪些

    以下是演示“如何在Python复制文件”的九种方法。shutil copyfile ()方法shutil copy ()方法shutil copyfileobj()方法shutil copy2
    发表于 08-13 17:43 6次下载
    使用<b class='flag-5'>Python</b><b class='flag-5'>复制</b><b class='flag-5'>文件</b>的方法有哪些

    使用python实现文件处理的资料详细说明

    python 中对文件文件夹(文件操作函数)的操作需要涉及到os 模块和shutil 模块。
    发表于 08-24 17:15 6次下载
    使用<b class='flag-5'>python</b><b class='flag-5'>实现</b><b class='flag-5'>文件</b>处理的资料详细说明

    python文件操作实例代码说明

    本文档的主要内容详细介绍的是python文件操作实例代码说明。
    发表于 09-07 18:21 11次下载
    <b class='flag-5'>python</b>的<b class='flag-5'>文件</b><b class='flag-5'>操作</b>实例代码说明

    python文件和目录的操作方法介绍和实例说明

    这篇文章主要介绍了python 文件和目录的操作方法,简明总结了文件和目录操作中常用的模块、方法,并列举了一个综合实例,需要的朋友可以参考下
    发表于 09-16 17:12 5次下载
    <b class='flag-5'>python</b><b class='flag-5'>文件</b>和目录的<b class='flag-5'>操作</b>方法介绍和实例说明

    python文件和目录的操作方法介绍和实例说明

    这篇文章主要介绍了python 文件和目录的操作方法,简明总结了文件和目录操作中常用的模块、方法,并列举了一个综合实例,需要的朋友可以参考下
    发表于 09-16 17:12 0次下载
    <b class='flag-5'>python</b><b class='flag-5'>文件</b>和目录的<b class='flag-5'>操作</b>方法介绍和实例说明

    abaqus-Python实例-操作excel文件下载

    abaqus-Python实例-操作excel文件
    发表于 12-17 16:40 0次下载
    abaqus-<b class='flag-5'>Python</b>实例-<b class='flag-5'>操作</b>excel<b class='flag-5'>文件</b>下载

    python文件操作是什么

    一、什么是文件操作 一个完整的程序一般都包括数据的存储和读取;我们在前面写的程序数据都没有进行实际的存储,因此python解释器执行完数据就消失了 实际开发中,我们经常需要从外部存储介质(硬盘、光盘
    的头像 发表于 06-21 17:15 2191次阅读
    <b class='flag-5'>python</b><b class='flag-5'>文件</b><b class='flag-5'>操作</b>是什么

    如何使用Python读取写入Word文件

    01 准备 Python 是一种通用编程语言,也可以用于处理 Microsoft Word 文件。在本文中,我将向你介绍如何使用 Pythonpython-docx 库读取、写入
    的头像 发表于 09-27 17:03 2060次阅读

    Python教你用 Rows 快速操作csv文件

    Rows 是一个专门用于操作表格的第三方Python模块。 只要通过 Rows 读取 csv 文件,她就能生成可以被计算的 Python 对象。 相比于 pandas 的 pd.rea
    的头像 发表于 10-21 10:18 605次阅读

    如何用Python实现文件系统的操作功能

    近几年随着 Python 的热度不断上涨,人们渐渐使用这门编程语言来进行一些自动化操作,以节省重复劳动带来的效率低下,那么必定会涉及到对 文件系统的操作 ,包括
    的头像 发表于 10-30 14:27 413次阅读
    如何用<b class='flag-5'>Python</b>来<b class='flag-5'>实现</b><b class='flag-5'>文件</b>系统的<b class='flag-5'>操作</b>功能