189 8069 5689

python中复制的函数,python复制语句

Python的shutil模块中文件的复制操作

shutil.copyfile(src, dst):将名为src的文件的内容复制到名为dst的文件中 。

目前成都创新互联已为上1000+的企业提供了网站建设、域名、网络空间、网站托管维护、企业网站设计、镇原网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

src, dst是文件名

shutil.copy(source, destination)

shutil.copy() 函数实现文件复制功能,将 source 文件复制到 destination 文件夹中,两个参数都是字符串格式。如果 destination 是一个文件名称,那么它会被用来当作复制后的文件名称,即等于 复制 + 重命名。

source一定是文件名,destination可以是文件名也可以是文件夹名

举例如下:

shutil 模块

如何使用python复制大概200G的数据[任何语言只要能实现]

如果我理解的正确的话,楼主是要copy大文件吧。

python最经常使用的copy函数,应该是shutil.copyfile()了,它默认以16384bytes 的大小作为缓冲区,对于小的文件,的确不错。但是处理到大的文件的时候,性能下降就很严重。过小的buffer会不合适。

经过多次的尝试,发现10Mb的buffer最合适,再高也没有性能的提升。重载后的copy函数如下

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)

使用的时候记得添加相应的包。

python列表怎么复制

提问者这么短的描述,有点无法看懂,那就按照通常的几种方法来说吧:

简单列表的拷贝

已知一个列表,求生成一个新的列表,列表元素是原列表的复制

a=[1,2]

b=a

这种其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。

后果:如果对a或b的元素进行修改,a,b的值同时发生变化。

可以使用以下方法解决:

a=[1,2]

b=a[:]

这样修改a对b没有影响。修改b对a没有影响。

复杂列表的拷贝:

可以使用copy模块中的deepcopy函数。修改测试如下:

import copy

a=[1,[2]]

b=copy.deepcopy(a)

Python对象的拷贝

Python赋值操作或函数参数传递,传递的永远是对象引用(即内存地址),而不是对象内容。在Python中一切皆对象,对象又分为可变(mutable)和不可变(immutable)两种类型。对象拷贝是指在内存中创建新的对象,产生新的内存地址。当顶层对象和它的子元素对象全都是immutable不可变对象时,不存在被拷贝,因为没有产生新对象。浅拷贝(Shallow Copy),拷贝顶层对象,但不会拷贝内部的子元素对象。深拷贝(Deep Copy),递归拷贝顶层对象,以及它内部的子元素对象。

Python中一切皆对象,对象就像一个塑料盒子, 里面装的是数据。对象有不同类型,例如布尔型和整型,类型决定了可以对它进行的操作。现实生活中的"陶器"会暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。

对象的类型还决定了它装着的数据是允许被修改的变量(可变的mutable)还是不可被修改的常量(不可变的immutable)。你可以把不可变对象想象成一个透明但封闭的盒子:你可以看到里面装的数据,但是无法改变它。类似地,可变对象就像一个开着口的盒子,你不仅可以看到里面的数据,还可以拿出来修改它,但你无法改变这个盒子本身,即你无法改变对象的类型。

对象拷贝是指在内存中创建新的对象,产生新的内存地址。

浅拷贝(Shallow Copy),拷贝顶层对象,但不会拷贝内部的子元素对象。

2.1.1. 顶层是mutable,子元素全是immutable

当顶层对象是mutable可变对象,但是它的子元素对象全都是immutable不可变对象时,如[1, 'world', 2]

① 创建列表对象并赋值给变量a

② 导入copy模块,使用copy.copy()函数浅拷贝a,并赋值给变量b

③ 修改变量a的子元素a[0] = 3,由于整数是不可变对象,所以并不是修改1变为3,而是更改a[0]指向对象3

当顶层对象是 mutable可变对象 ,但子元素也存在 mutable可变对象 时,如 [1, 2, ['hello','world']]

① 浅拷贝 copy.copy() 只拷贝了顶层对象,没有拷贝子元素对象['hello','world'],即a[2]和b[2]指向同一个列表对象

② 修改a[2][1] = 'china',则b[2][1] = 'china'

当顶层对象是immutable不可变对象,同时它的子元素对象也全都是immutable不可变对象时,如(1, 2, 3)

变量a与变量b指向的是同一个元组对象,没有拷贝

当顶层对象是immutable不可变对象时,但子元素存在mutable可变对象时,如(1, 2, ['hello','world'])

变量a与变量b指向的是相同的元组对象,并且a[2]与b[2]指向同一个列表,所以修改a[2][1]会影响b[2][1]

深拷贝(Deep Copy),递归拷贝顶层对象,以及它内部的子元素对象

当顶层对象是mutable可变对象,但是它的子元素对象全都是immutable不可变对象时,如[1, 'world', 2]

变量a与变量b指向不同的列表对象,修改a[0]只是将列表a的第一个元素重新指向新对象,不会影响b[0]

当顶层对象是mutable可变对象,但子元素也存在mutable可变对象时,如[1, 2, ['hello','world']]

深拷贝既拷贝了顶层对象,又递归拷贝了子元素对象,所以a[2]与b[2]指向了两个不同的列表对象(但是列表对象的子元素初始指定的字符串对象一样),修改a[2][1] = 'china'后,它重新指向了新的字符串对象(内存地址为140531581905808),不会影响到b[2][1]

当顶层对象是immutable不可变对象,同时它的子元素对象也全都是immutable不可变对象时,如(1, 2, 3)

变量a与变量b指向的是同一个元组对象,不存在拷贝

当顶层对象是immutable不可变对象时,但子元素存在mutable可变对象时,如(1, 2, ['hello','world'])

变量a与变量b指向的是不同的元组对象,同时a[2]与b[2]指向不同的列表对象,所以修改a[2][1]不会影响b[2][1]

使用=是赋值,即将列表对象的引用也赋值给变量b,可以将列表对象想像成一个盒子,变量a相当于这个盒子上的标签,执行b = a后,相当于再在这个盒子上贴上b标签,a和b实际上指向的是同一个对象。因此,无论我们是通过a还是通过b来修改列表的内容,其结果都会作用于双方。

b/c/d都是a的复制,它们都指向了不同的列表对象,但是没有拷贝子元素,a[2]和b[2]/c[2]/d[2]指向同一个列表, 相当于浅拷贝的效果

使用分片[:]操作,a和b其实是指向同一个元组,而且没有拷贝子元素,a[2]和b[2]也指向同一个列表,相当于浅拷贝的效果

同列表类似,可以使用字典的copy()函数或者转换函数dict()

变量a与变量b/c指向不同的字典,但是没有拷贝子元素,a['jobs']和b['jobs']/c['jobs']指定同一个列表, 相当于浅拷贝的效果

同列表类似,可以使用集合的copy()函数或者转换函数set()

变量a与变量b/c指向不同的集合,而集合的元素必须是hashable,所以修改集合a不会影响到b/c


文章标题:python中复制的函数,python复制语句
转载来源:http://cdxtjz.cn/article/dseejis.html

其他资讯