shutil.copyfile(src, dst):將名為src的文件的內(nèi)容復(fù)制到名為dst的文件中 。

目前成都創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、鎮(zhèn)原網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
src, dst是文件名
shutil.copy(source, destination)
shutil.copy() 函數(shù)實(shí)現(xiàn)文件復(fù)制功能,將 source 文件復(fù)制到 destination 文件夾中,兩個(gè)參數(shù)都是字符串格式。如果 destination 是一個(gè)文件名稱,那么它會(huì)被用來當(dāng)作復(fù)制后的文件名稱,即等于 復(fù)制 + 重命名。
source一定是文件名,destination可以是文件名也可以是文件夾名
舉例如下:
shutil 模塊
如果我理解的正確的話,樓主是要copy大文件吧。
python最經(jīng)常使用的copy函數(shù),應(yīng)該是shutil.copyfile()了,它默認(rèn)以16384bytes 的大小作為緩沖區(qū),對于小的文件,的確不錯(cuò)。但是處理到大的文件的時(shí)候,性能下降就很嚴(yán)重。過小的buffer會(huì)不合適。
經(jīng)過多次的嘗試,發(fā)現(xiàn)10Mb的buffer最合適,再高也沒有性能的提升。重載后的copy函數(shù)如下
def?copyFile(src,?dst,?buffer_size=10485760,?perserveFileDate=True):
'''
Copies?a?file?to?a?new?location.?Much?faster?performance?than?Apache?Commons?due?to?use?of?larger?buffer
@param?src:????Source?File
@param?dst:????Destination?File?(not?file?path)
@param?buffer_size:????Buffer?size?to?use?during?copy
@param?perserveFileDate:????Preserve?the?original?file?date
'''
#????Check?to?make?sure?destination?directory?exists.?If?it?doesn't?create?the?directory
dstParent,?dstFileName?=?os.path.split(dst)
if(not(os.path.exists(dstParent))):
os.makedirs(dstParent)
#????Optimize?the?buffer?for?small?files
buffer_size?=?min(buffer_size,os.path.getsize(src))
if(buffer_size?==?0):
buffer_size?=?1024
if?shutil._samefile(src,?dst):
raise?shutil.Error("`%s`?and?`%s`?are?the?same?file"?%?(src,?dst))
for?fn?in?[src,?dst]:
try:
st?=?os.stat(fn)
except?OSError:
#?File?most?likely?does?not?exist
pass
else:
#?XXX?What?about?other?special?files??(sockets,?devices...)
if?shutil.stat.S_ISFIFO(st.st_mode):
raise?shutil.SpecialFileError("`%s`?is?a?named?pipe"?%?fn)
with?open(src,?'rb')?as?fsrc:
with?open(dst,?'wb')?as?fdst:
shutil.copyfileobj(fsrc,?fdst,?buffer_size)
if(perserveFileDate):
shutil.copystat(src,?dst)
使用的時(shí)候記得添加相應(yīng)的包。
提問者這么短的描述,有點(diǎn)無法看懂,那就按照通常的幾種方法來說吧:
簡單列表的拷貝
已知一個(gè)列表,求生成一個(gè)新的列表,列表元素是原列表的復(fù)制
a=[1,2]
b=a
這種其實(shí)并未真正生成一個(gè)新的列表,b指向的仍然是a所指向的對象。
后果:如果對a或b的元素進(jìn)行修改,a,b的值同時(shí)發(fā)生變化。
可以使用以下方法解決:
a=[1,2]
b=a[:]
這樣修改a對b沒有影響。修改b對a沒有影響。
復(fù)雜列表的拷貝:
可以使用copy模塊中的deepcopy函數(shù)。修改測試如下:
import copy
a=[1,[2]]
b=copy.deepcopy(a)
Python賦值操作或函數(shù)參數(shù)傳遞,傳遞的永遠(yuǎn)是對象引用(即內(nèi)存地址),而不是對象內(nèi)容。在Python中一切皆對象,對象又分為可變(mutable)和不可變(immutable)兩種類型。對象拷貝是指在內(nèi)存中創(chuàng)建新的對象,產(chǎn)生新的內(nèi)存地址。當(dāng)頂層對象和它的子元素對象全都是immutable不可變對象時(shí),不存在被拷貝,因?yàn)闆]有產(chǎn)生新對象。淺拷貝(Shallow Copy),拷貝頂層對象,但不會(huì)拷貝內(nèi)部的子元素對象。深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內(nèi)部的子元素對象。
Python中一切皆對象,對象就像一個(gè)塑料盒子, 里面裝的是數(shù)據(jù)。對象有不同類型,例如布爾型和整型,類型決定了可以對它進(jìn)行的操作。現(xiàn)實(shí)生活中的"陶器"會(huì)暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。
對象的類型還決定了它裝著的數(shù)據(jù)是允許被修改的變量(可變的mutable)還是不可被修改的常量(不可變的immutable)。你可以把不可變對象想象成一個(gè)透明但封閉的盒子:你可以看到里面裝的數(shù)據(jù),但是無法改變它。類似地,可變對象就像一個(gè)開著口的盒子,你不僅可以看到里面的數(shù)據(jù),還可以拿出來修改它,但你無法改變這個(gè)盒子本身,即你無法改變對象的類型。
對象拷貝是指在內(nèi)存中創(chuàng)建新的對象,產(chǎn)生新的內(nèi)存地址。
淺拷貝(Shallow Copy),拷貝頂層對象,但不會(huì)拷貝內(nèi)部的子元素對象。
2.1.1. 頂層是mutable,子元素全是immutable
當(dāng)頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時(shí),如[1, 'world', 2]
① 創(chuàng)建列表對象并賦值給變量a
② 導(dǎo)入copy模塊,使用copy.copy()函數(shù)淺拷貝a,并賦值給變量b
③ 修改變量a的子元素a[0] = 3,由于整數(shù)是不可變對象,所以并不是修改1變?yōu)?,而是更改a[0]指向?qū)ο?
當(dāng)頂層對象是 mutable可變對象 ,但子元素也存在 mutable可變對象 時(shí),如 [1, 2, ['hello','world']]
① 淺拷貝 copy.copy() 只拷貝了頂層對象,沒有拷貝子元素對象['hello','world'],即a[2]和b[2]指向同一個(gè)列表對象
② 修改a[2][1] = 'china',則b[2][1] = 'china'
當(dāng)頂層對象是immutable不可變對象,同時(shí)它的子元素對象也全都是immutable不可變對象時(shí),如(1, 2, 3)
變量a與變量b指向的是同一個(gè)元組對象,沒有拷貝
當(dāng)頂層對象是immutable不可變對象時(shí),但子元素存在mutable可變對象時(shí),如(1, 2, ['hello','world'])
變量a與變量b指向的是相同的元組對象,并且a[2]與b[2]指向同一個(gè)列表,所以修改a[2][1]會(huì)影響b[2][1]
深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內(nèi)部的子元素對象
當(dāng)頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時(shí),如[1, 'world', 2]
變量a與變量b指向不同的列表對象,修改a[0]只是將列表a的第一個(gè)元素重新指向新對象,不會(huì)影響b[0]
當(dāng)頂層對象是mutable可變對象,但子元素也存在mutable可變對象時(shí),如[1, 2, ['hello','world']]
深拷貝既拷貝了頂層對象,又遞歸拷貝了子元素對象,所以a[2]與b[2]指向了兩個(gè)不同的列表對象(但是列表對象的子元素初始指定的字符串對象一樣),修改a[2][1] = 'china'后,它重新指向了新的字符串對象(內(nèi)存地址為140531581905808),不會(huì)影響到b[2][1]
當(dāng)頂層對象是immutable不可變對象,同時(shí)它的子元素對象也全都是immutable不可變對象時(shí),如(1, 2, 3)
變量a與變量b指向的是同一個(gè)元組對象,不存在拷貝
當(dāng)頂層對象是immutable不可變對象時(shí),但子元素存在mutable可變對象時(shí),如(1, 2, ['hello','world'])
變量a與變量b指向的是不同的元組對象,同時(shí)a[2]與b[2]指向不同的列表對象,所以修改a[2][1]不會(huì)影響b[2][1]
使用=是賦值,即將列表對象的引用也賦值給變量b,可以將列表對象想像成一個(gè)盒子,變量a相當(dāng)于這個(gè)盒子上的標(biāo)簽,執(zhí)行b = a后,相當(dāng)于再在這個(gè)盒子上貼上b標(biāo)簽,a和b實(shí)際上指向的是同一個(gè)對象。因此,無論我們是通過a還是通過b來修改列表的內(nèi)容,其結(jié)果都會(huì)作用于雙方。
b/c/d都是a的復(fù)制,它們都指向了不同的列表對象,但是沒有拷貝子元素,a[2]和b[2]/c[2]/d[2]指向同一個(gè)列表, 相當(dāng)于淺拷貝的效果
使用分片[:]操作,a和b其實(shí)是指向同一個(gè)元組,而且沒有拷貝子元素,a[2]和b[2]也指向同一個(gè)列表,相當(dāng)于淺拷貝的效果
同列表類似,可以使用字典的copy()函數(shù)或者轉(zhuǎn)換函數(shù)dict()
變量a與變量b/c指向不同的字典,但是沒有拷貝子元素,a['jobs']和b['jobs']/c['jobs']指定同一個(gè)列表, 相當(dāng)于淺拷貝的效果
同列表類似,可以使用集合的copy()函數(shù)或者轉(zhuǎn)換函數(shù)set()
變量a與變量b/c指向不同的集合,而集合的元素必須是hashable,所以修改集合a不會(huì)影響到b/c
本文標(biāo)題:python中復(fù)制的函數(shù),python復(fù)制語句
地址分享:http://chinadenli.net/article3/dseejis.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)公司、電子商務(wù)、全網(wǎng)營銷推廣、軟件開發(fā)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)