Python 里的拷贝

深拷贝deepcopy与浅拷贝copy

 

1.   copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
  2. copy.deepcopy 深拷贝 拷贝对象及其子对象
  一个很好的例子:
 
 

import copy
  a = [1, 2, 3, 4, ['a', 'b']]  #原始对象
 
  b = a  #赋值,传对象的引用
  c = copy.copy(a)    #对象拷贝,浅拷贝
  d = copy.deepcopy(a)  #对象拷贝,深拷贝
 
  a.append(5)  #修改对象a
  a[4].append('c')  #修改对象a中的['a', 'b']数组对象
 
  print 'a = ', a
  print 'b = ', b
  print 'c = ', c
  print 'd = ', d
  输出结果:
  a =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
  b =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
  c =  [1, 2, 3, 4, ['a', 'b', 'c']]
  d =  [1, 2, 3, 4, ['a', 'b']]
 
 

 

 

 

 

Python 中的几种copy用法

也在博客园里看到的好帖,觉得好就移过来了,学习学习。。。

1. os.system

Python code
import os import tempfile filename1 = tempfile.mktemp (".txt") #产生临时文件或目录,tempfile.mktemp(suffix='',prefix='tmp',dir=None) 产生的文件名或目录,默认就是函数里的参数。
open (filename1, "w").close () filename2 = filename1 +".copy"print filename1, "=>", filename2 #拷文件os.system ("copy %s %s"% (filename1, filename2)) if os.path.isfile (filename2): print"Success" dirname1 = tempfile.mktemp (".dir") os.mkdir (dirname1) dirname2 = dirname1 +".copy"print dirname1, "=>", dirname2 #拷目录os.system ("xcopy /s %s %s"% (dirname1, dirname2)) #DOS下,拷贝目录命令xcopy if os.path.isdir (dirname2): print"Success"
2. shutil.copy和shutil.copytree
Python code
import os import shutil import tempfile filename1 = tempfile.mktemp (".txt") open (filename1, "w").close () filename2 = filename1 +".copy"print filename1, "=>", filename2 #拷文件shutil.copy (filename1, filename2) if os.path.isfile (filename2): print"Success" dirname1 = tempfile.mktemp (".dir") os.mkdir (dirname1) dirname2 = dirname1 +".copy"print dirname1, "=>", dirname2 #拷目录shutil.copytree (dirname1, dirname2) if os.path.isdir (dirname2): print"Success"

3. win32file.CopyFile

Python code
import os import win32file import tempfile filename1 = tempfile.mktemp (".txt") open (filename1, "w").close () filename2 = filename1 +".copy"print filename1, "=>", filename2 #拷文件 #文件已存在时,1为不覆盖,0为覆盖win32file.CopyFile (filename1, filename2, 1) win32file.CopyFile (filename1, filename2, 0) win32file.CopyFile (filename1, filename2, 1) if os.path.isfile (filename2): print"Success" dirname1 = tempfile.mktemp (".dir") os.mkdir (dirname1) dirname2 = dirname1 +".copy"print dirname1, "=>", dirname2 #拷目录win32file.CopyFile (dirname1, dirname2, 1) if os.path.isdir (dirname2): print"Success"
4. SHFileOperation
Python code
import os from win32com.shell import shell, shellcon import tempfile filename1 = tempfile.mktemp (".txt") open (filename1, "w").close () filename2 = filename1 +".copy"print filename1, "=>", filename2 #拷文件 #文件已存在时,shellcon.FOF_RENAMEONCOLLISION会指示重命名文件shell.SHFileOperation ( (0, shellcon.FO_COPY, filename1, filename2, 0, None, None) ) shell.SHFileOperation ( (0, shellcon.FO_COPY, filename1, filename2, shellcon.FOF_RENAMEONCOLLISION, None, None) ) shell.SHFileOperation ( (0, shellcon.FO_COPY, filename1, filename2, 0, None, None) ) if os.path.isfile (filename2): print"Success" dirname1 = tempfile.mktemp (".dir") os.mkdir (dirname1) dirname2 = dirname1 +".copy"print dirname1, "=>", dirname2 #拷目录shell.SHFileOperation ( (0, shellcon.FO_COPY, dirname1, dirname2, 0, None, None) ) if os.path.isdir (dirname2): print"Success"
测试结果出来了: 测试环境:系统——Win7 RTM,CPU——P4 3.0,MEM——1.5G DDR400,U盘——Kingston 4G
用4种不同的方法从硬盘拷贝MSDN 2008 SP1(2.37G)到U盘:
os System 的方法耗时903.218秒 shutil 的方法耗时1850.634秒 win32file 的方法耗时861.438秒 SHFileOperation的方法耗时794.023秒
另外SHFileOperation是显示对话框的,可以这样用

SHFileOperation能操作网络上的文件 如果你想将本地文件复制到192.168.1.99 那么只要在192.168.1.99上共享123目录 然后将pTo设置为http://www.cnblogs.com/lovemo1314/admin/file://192.168.1.99/123 就可以了 但不要设置为http://www.cnblogs.com/lovemo1314/admin/file://192.168.1.99/


Python code
shell.SHFileOperation ( 
(0, shellcon.FO_COPY, filename1, filename2, 
shellcon.FOF_RENAMEONCOLLISION |
\ shellcon.FOF_NOCONFIRMATION |\ 
shellcon.FOF_NOERRORUI | \ 
shellcon.FOF_SILENT, None, None))
FOF_SILENT  //不产生正在复制的对话框 FOF_NOCONFIRMMKDIR//如果目的目录不存在,就默认创建 FOF_NOCONFIRMATION //不出现确认文件替换对话框(Confirmation Dialog)(默认替换原来的文i件) FOF_NOERRORUI//不出现错误对话框 最好不要同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR,因为FOF_NOCONFIRMMKDIR屏蔽了missing directory Error 但FOF_NOERROR又屏蔽了missing directory Error,那么在同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR

 

posted @ 2011-11-28 23:04  落尘祥  阅读(504)  评论(0编辑  收藏  举报