Windows下用Python你会几种copy文件的方法?

thy38 2009-09-12 10:12:16
1. os.system
import os
import tempfile

filename1 = tempfile.mktemp (".txt")
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))

if os.path.isdir (dirname2): print "Success"


2. shutil.copy和shutil.copytree
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
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
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"


不知道有没有其它的了,os.rename不算,那个是移动文件。另外我在测试它们的性能如何。
...全文
10414 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gift_lbs 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qinguan0619 的回复:]
引用 1 楼 darkchampion 的回复:
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html

这个网址真不错。。。学习。。
[/Quote]
回家看… 先mark…
PS--楼上头像好大…
zfzaizheli 2009-09-15
  • 打赏
  • 举报
回复
不错不错,藏起来~~
cppfaq 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qinguan0619 的回复:]
引用 1 楼 darkchampion 的回复:
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html

这个网址真不错。。。学习。。
[/Quote]
很好,收藏了
nietsche 2009-09-14
  • 打赏
  • 举报
回复
确实如此,用shutil复制文件速度是比win32file.CopyFile要慢很多的。
难道是因为太“高层”,还是因为实在win下?
所有,大文件现在我可能用的多的是win32file了,
DarkChampion 2009-09-12
  • 打赏
  • 举报
回复
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
这里和楼主列出的都一样,没有更多的了


或者使用Chilkat
http://www.chilkatsoft.com/refdoc/pythonCkFileAccessRef.html
qinguan0619 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 darkchampion 的回复:]
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
[/Quote]
这个网址真不错。。。学习。。
thy38 2009-09-12
  • 打赏
  • 举报
回复
测试结果出来了:
测试环境:系统——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是显示对话框的,可以这样用
shell.SHFileOperation (
(0, shellcon.FO_COPY, filename1, filename2,
shellcon.FOF_RENAMEONCOLLISION | \
shellcon.FOF_NOCONFIRMATION |\
shellcon.FOF_NOERRORUI | \
shellcon.FOF_SILENT, None, None)
)
thy38 2009-09-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 darkchampion 的回复:]
或者使用Chilkat
http://www.chilkatsoft.com/refdoc/pythonCkFileAccessRef.html
[/Quote]

不错,又让我学到一样,不过Chilkat是收费的啊,用惯了开源的还真不习惯。
killbug2004 2009-09-12
  • 打赏
  • 举报
回复
学习学习 python我用的最多功能就是字符串处理 网页等文件解析 和 文件处理

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧