91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何實(shí)現(xiàn)Python復(fù)制文件操作

馬哥Linux運(yùn)維 ? 來源:博客園 ? 2024-07-18 14:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Python 中有許多“開蓋即食”的模塊(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在這篇文章中,你將會(huì)看到一些用 Python 實(shí)現(xiàn)文件復(fù)制的特殊方法。下面我們開始學(xué)習(xí)這九種不同的方法來實(shí)現(xiàn) Python 復(fù)制文件操作。

在開始之前,你必須明白為什么了解最適合你的 Python 復(fù)制文件方法是如此重要。這是因?yàn)槲募?I/O 操作屬于性能密集型而且經(jīng)常會(huì)達(dá)到瓶頸。這就是為什么你應(yīng)該根據(jù)你的應(yīng)用程序的設(shè)計(jì)選擇最好的方法。

一些共享資源的程序會(huì)傾向于以阻塞模式來復(fù)制文件,而有些則可能希望以異步方式執(zhí)行。比如 — 使用線程來復(fù)制文件或者啟動(dòng)單獨(dú)的進(jìn)程來實(shí)現(xiàn)它。還有一點(diǎn)需要考慮的是平臺(tái)的可移植性。這意味著你應(yīng)該知道你要運(yùn)行的程序所在的目標(biāo)操作系統(tǒng)(Windows/Linux/Mac OS X 等)。

用 Python 復(fù)制文件的 9 種方法具體是:

shutil copyfile() 方法

shutil copy() 方法

shutil copyfileobj() 方法

shutil copy2() 方法

os popen 方法

os system() 方法

threading Thread() 方法

subprocess call() 方法

subprocess check_output() 方法

Shutil Copyfile()方法

只有當(dāng)目標(biāo)是可寫的,這個(gè)方法才會(huì)將源內(nèi)容復(fù)制到目標(biāo)位置。如果你沒有寫入權(quán)限,則會(huì)導(dǎo)致 IOError 異常。

它會(huì)打開輸入文件進(jìn)行讀取并忽略其文件類型。接下來,它不會(huì)以任何不同的方式處理特殊文件,也不會(huì)將它們復(fù)制為新的特殊文件。

Copyfile() 方法使用下面的低級(jí)函數(shù) copyfileobj()。它將文件名作為參數(shù),打開它們并將文件句柄傳遞給 copyfileobj()。這個(gè)方法中有一個(gè)可選的第三個(gè)參數(shù),你可用它來指定緩沖區(qū)長度。然后它會(huì)打開文件并讀取指定緩沖區(qū)大小的塊。但是,默認(rèn)是一次讀取整個(gè)文件。

copyfile(source_file, destination_file)

以下是關(guān)于 copyfile() 方法的要點(diǎn)。

它將源內(nèi)容復(fù)制到目標(biāo)文件中。

如果目標(biāo)文件不可寫入,那么復(fù)制操作將導(dǎo)致 IOError 異常。

如果源文件和目標(biāo)文件都相同,它將會(huì)返回 SameFileError。

但是,如果目標(biāo)文件之前有不同的名稱,那么該副本將會(huì)覆蓋其內(nèi)容。

如果目標(biāo)是一個(gè)目錄,這意味著此方法不會(huì)復(fù)制到目錄,那么會(huì)發(fā)生 Error 13。

它不支持復(fù)制諸如字符或塊驅(qū)動(dòng)以及管道等文件。

# 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”命令。這意味著如果目標(biāo)是一個(gè)文件夾,那么它將在其中創(chuàng)建一個(gè)與源文件具有相同名稱(基本名稱)的新文件。此外,該方法會(huì)在復(fù)制源文件的內(nèi)容后同步目標(biāo)文件權(quán)限到源文件。

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() 還可以在復(fù)制內(nèi)容時(shí)設(shè)置權(quán)限位,而 copyfile() 只復(fù)制數(shù)據(jù)。

如果目標(biāo)是目錄,則 copy() 將復(fù)制文件,而 copyfile() 會(huì)失敗,出現(xiàn) Error 13。

有趣的是,copyfile() 方法在實(shí)現(xiàn)過程中使用 copyfileobj() 方法,而 copy() 方法則是依次使用 copyfile() 和 copymode() 函數(shù)。

在 Potion-3 可以很明顯看出 copyfile() 會(huì)比 copy() 快一點(diǎn),因?yàn)楹笳邥?huì)有一個(gè)附加任務(wù)(保留權(quán)限)。

Shutil Copyfileobj()方法

該方法將文件復(fù)制到目標(biāo)路徑或者文件對(duì)象。如果目標(biāo)是文件對(duì)象,那么你需要在調(diào)用 copyfileobj() 之后關(guān)閉它。它還假定了一個(gè)可選參數(shù)(緩沖區(qū)大小),你可以用來設(shè)置緩沖區(qū)長度。這是復(fù)制過程中保存在內(nèi)存中的字節(jié)數(shù)。系統(tǒng)使用的默認(rèn)大小是 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()。但是它可以在復(fù)制數(shù)據(jù)時(shí)獲取元數(shù)據(jù)中添加的訪問和修改時(shí)間。復(fù)制相同的文件會(huì)導(dǎo)致 SameFileError 異常。

copy() vs copy2() :

copy() 只能設(shè)置權(quán)限位,而 copy2() 還可以使用時(shí)間戳來更新文件元數(shù)據(jù)。

copy() 在函數(shù)內(nèi)部調(diào)用 copyfile() 和 copymode(), 而 copy2() 是調(diào)用 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'))

該方法創(chuàng)建一個(gè)發(fā)送或者接受命令的管道。它返回一個(gè)打開的并且連接管道的文件對(duì)象。你可以根據(jù)文件打開模式將其用于讀取或者寫入比如‘r’(默認(rèn))或者‘w’。

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

mode – 它可以是‘r’(默認(rèn))或者‘w’

Bufsize – 如果它的值是0,那么就不會(huì)出現(xiàn)緩沖。如果將它設(shè)置為1,那么在訪問文件時(shí)就會(huì)發(fā)生行緩沖。如果你提供一個(gè)大于1的值,那么就會(huì)在指定緩沖區(qū)大小的情況下發(fā)生緩沖。但是,對(duì)于負(fù)值,系統(tǒng)將采用默認(rèn)緩沖區(qū)大小。

對(duì)于Windows系統(tǒng):

import os
os.popen('copy http://m.xsypw.cn/images/chaijie_default.png 2.txt.py')

對(duì)于Liunx系統(tǒng):

import os
os.popen('cp http://m.xsypw.cn/images/chaijie_default.png 2.txt.py')

Os System()方法

這是運(yùn)行任何系統(tǒng)命令的最常用方式。使用 system() 方法,你可以調(diào)用 subshell 中的任何命令。在內(nèi)部,該方法將調(diào)用 C 語言的標(biāo)準(zhǔn)庫函數(shù)。

該方法返回該命令的退出狀態(tài)。

對(duì)于 Windows 系統(tǒng):

import os
os.system('copy http://m.xsypw.cn/images/chaijie_default.png 2.txt.py') 

對(duì)于 Liunx 系統(tǒng):

import os
os.system('cp http://m.xsypw.cn/images/chaijie_default.png 2.txt.py')

使用異步方式的線程庫復(fù)制文件

如果你想以異步方式復(fù)制文件,那么使用下面的方法。在這里,我們使用 Python 的線程模塊在后臺(tái)進(jìn)行復(fù)制操作。

在使用這種方法時(shí),請(qǐng)確保使用鎖定以避免鎖死。如果你的應(yīng)用程序使用多個(gè)線程讀取/寫入文件,就可能會(huì)遇到這種情況。

import shutil
from threading import Thread

src="http://m.xsypw.cn/images/chaijie_default.png"
dst="3.txt.py"

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

使用Subprocess的Call()方法復(fù)制文件

Subprocess 模塊提供了一個(gè)簡單的接口來處理子進(jìn)程。它讓我們能夠啟動(dòng)子進(jìn)程,連接到子進(jìn)程的輸入/輸出/錯(cuò)誤管道,并檢索返回值。

subprocess 模塊旨在替換舊版模塊和函數(shù),比如 – os.system, os.spawn, os.popen, popen2.*

它使用 call() 方法調(diào)用系統(tǒng)命令來執(zhí)行用戶任務(wù)。

import subprocess

src="http://m.xsypw.cn/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() 方法復(fù)制文件

使用 subprocess 中的 Check_output() 方法,你可以運(yùn)行外部命令或程序并捕獲其輸出。它也支持管道。

import os, subprocess

src=os.path.realpath(os.getcwd() + "http://cdn.techbeamers.com/http://m.xsypw.cn/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'))

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213738
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    579

    瀏覽量

    25359
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86707

原文標(biāo)題:用Python復(fù)制文件的9個(gè)方法

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    python學(xué)習(xí)--文件操作

    進(jìn)入第7天的學(xué)習(xí),學(xué)到了python文件操作,教程說是和C語言兼容,于是就迫不及待的的想試試。按照教程的輸入,直接改成自己的目錄f=open('D:\python\text.txt'
    發(fā)表于 12-25 16:41

    請(qǐng)問python文件怎么操作

    python文件操作步驟
    發(fā)表于 11-16 07:53

    C語言-文件操作

    在應(yīng)用程序中,經(jīng)常需要用文件來保存數(shù)據(jù),這就要用到文件的輸入/輸出操作。本章主要介紹和文件相關(guān)的類,以及目錄、文件
    發(fā)表于 04-23 11:11 ?13次下載

    linux中復(fù)制文件的方法

     linux中如何復(fù)制文件
    發(fā)表于 06-03 09:17 ?2357次閱讀
    linux中<b class='flag-5'>復(fù)制</b><b class='flag-5'>文件</b>的方法

    使用Python復(fù)制文件的方法有哪些

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

    使用python實(shí)現(xiàn)文件處理的資料詳細(xì)說明

    python 中對(duì)文件文件夾(文件操作函數(shù))的操作需要涉及到os 模塊和shutil 模塊。
    發(fā)表于 08-24 17:15 ?6次下載
    使用<b class='flag-5'>python</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>文件</b>處理的資料詳細(xì)說明

    python文件操作實(shí)例代碼說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是python文件操作實(shí)例代碼說明。
    發(fā)表于 09-07 18:21 ?11次下載
    <b class='flag-5'>python</b>的<b class='flag-5'>文件</b><b class='flag-5'>操作</b>實(shí)例代碼說明

    python文件和目錄的操作方法介紹和實(shí)例說明

    這篇文章主要介紹了python 文件和目錄的操作方法,簡明總結(jié)了文件和目錄操作中常用的模塊、方法,并列舉了一個(gè)綜合實(shí)例,需要的朋友可以參考下
    發(fā)表于 09-16 17:12 ?7次下載
    <b class='flag-5'>python</b><b class='flag-5'>文件</b>和目錄的<b class='flag-5'>操作</b>方法介紹和實(shí)例說明

    python文件和目錄的操作方法介紹和實(shí)例說明

    這篇文章主要介紹了python 文件和目錄的操作方法,簡明總結(jié)了文件和目錄操作中常用的模塊、方法,并列舉了一個(gè)綜合實(shí)例,需要的朋友可以參考下
    發(fā)表于 09-16 17:12 ?0次下載
    <b class='flag-5'>python</b><b class='flag-5'>文件</b>和目錄的<b class='flag-5'>操作</b>方法介紹和實(shí)例說明

    abaqus-Python實(shí)例-操作excel文件下載

    abaqus-Python實(shí)例-操作excel文件
    發(fā)表于 12-17 16:40 ?0次下載
    abaqus-<b class='flag-5'>Python</b>實(shí)例-<b class='flag-5'>操作</b>excel<b class='flag-5'>文件</b>下載

    python文件操作是什么

    一、什么是文件操作 一個(gè)完整的程序一般都包括數(shù)據(jù)的存儲(chǔ)和讀取;我們?cè)谇懊鎸懙某绦驍?shù)據(jù)都沒有進(jìn)行實(shí)際的存儲(chǔ),因此python解釋器執(zhí)行完數(shù)據(jù)就消失了 實(shí)際開發(fā)中,我們經(jīng)常需要從外部存儲(chǔ)介質(zhì)(硬盤、光盤
    的頭像 發(fā)表于 06-21 17:15 ?2837次閱讀
    <b class='flag-5'>python</b><b class='flag-5'>文件</b><b class='flag-5'>操作</b>是什么

    如何使用Python讀取寫入Word文件

    01 準(zhǔn)備 Python 是一種通用編程語言,也可以用于處理 Microsoft Word 文件。在本文中,我將向你介紹如何使用 Pythonpython-docx 庫讀取、寫入
    的頭像 發(fā)表于 09-27 17:03 ?2481次閱讀

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

    Rows 是一個(gè)專門用于操作表格的第三方Python模塊。 只要通過 Rows 讀取 csv 文件,她就能生成可以被計(jì)算的 Python 對(duì)象。 相比于 pandas 的 pd.rea
    的頭像 發(fā)表于 10-21 10:18 ?961次閱讀

    如何用Python實(shí)現(xiàn)文件系統(tǒng)的操作功能

    近幾年隨著 Python 的熱度不斷上漲,人們漸漸使用這門編程語言來進(jìn)行一些自動(dòng)化操作,以節(jié)省重復(fù)勞動(dòng)帶來的效率低下,那么必定會(huì)涉及到對(duì) 文件系統(tǒng)的操作 ,包括
    的頭像 發(fā)表于 10-30 14:27 ?644次閱讀
    如何用<b class='flag-5'>Python</b>來<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>文件</b>系統(tǒng)的<b class='flag-5'>操作</b>功能

    hyper v 復(fù)制,hyper v 復(fù)制如何操作

    工作效率。今天就為大家介紹hyperv復(fù)制如何操作。 ? ?Hyper-V提供了多種方法來實(shí)現(xiàn)文件復(fù)制和共享,以下是幾種常見的
    的頭像 發(fā)表于 01-22 16:01 ?1101次閱讀
    hyper v <b class='flag-5'>復(fù)制</b>,hyper v <b class='flag-5'>復(fù)制</b>如何<b class='flag-5'>操作</b>
    主站蜘蛛池模板: 诱人的老师bd高清日本在线观看 | 国产精品福利午夜一级毛片 | 男女无遮挡一进一出性视频 | 人人做人人看 | 思思久99久女女精品 | 最新人妖shemaletube人妖 最新日本免费一区二区三区中文 | 中文字幕在线播放不卡 | 国产午夜在线观看视频播放 | www.色网| 一级看片免费视频 | 波多野结衣在线视频免费观看 | 久久99热精品免费观看无卡顿 | 中文永久免费看电视网站入口 | 国产一区二区三区 韩国女主播 | 男人不识本站 | 久久精品屋 | 午夜免费观看_视频在线观看 | 美女视频很黄很a免费国产 美女视频很黄很暴黄是免费的 | 天堂资源在线www中文 | 综合激情五月婷婷 | 免费色在线 | 日本写真高清视频免费网站网 | 欧美一区二区三区在线 | 美女免费观看一区二区三区 | 色中色在线视频 | 97精品伊人久久久大香线焦 | 国产人人看 | 啪啪啦资源站永久 | 日产国产精品亚洲系列 | 亚洲色播永久网址大全 | 亚洲jizzjizz中国妇女 | 四虎新地址| 欧美性喷潮 | 未成人禁止视频高清在线观看 | 国产精品一区电影 | 国产精品视频色拍拍 | 夜夜爽免费视频 | 欧美性xxxxxbbbbbb精品 | 五月婷婷六月婷婷 | 在线观看国产一级强片 | 第四色激情 |