VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python3标准库:shutil高层文件操作

1. shutil高层文件操作

shutil模块包括一些高层文件操作,如复制和归档。

1.1 复制文件

copyfile()将源文件的内容复制到目标文件,如果没有权限写目标文件,则会产生IOError。


  1. import glob
  2. import shutil
  3.  
  4. print('BEFORE:', glob.glob('shutil_copyfile.*'))
  5.  
  6. shutil.copyfile('shutil_copyfile.py', 'shutil_copyfile.py.copy')
  7.  
  8. print('AFTER:', glob.glob('shutil_copyfile.*'))

由于这个函数会打开输入文件进行读取,而不论其类型,所以某些特殊文件(如UNIX设备节点)不能用copyfile()复制为新的特殊文件。

copyfile()的实现使用了底层函数copyfileobj()。copyfile()的参数是文件名,但copyfileobj()的参数是打开的文件句柄。还可以有第三个参数(可选):读入块使用的一个缓冲区长度。 


  1. import io
  2. import os
  3. import shutil
  4. import sys
  5.  
  6.  
  7. class VerboseStringIO(io.StringIO):
  8.  
  9. def read(self, n=-1):
  10. next = io.StringIO.read(self, n)
  11. print('read({}) got {} bytes'.format(n, len(next)))
  12. return next
  13.  
  14.  
  15. lorem_ipsum = '''Lorem ipsum dolor sit amet, consectetuer
  16. adipiscing elit. Vestibulum aliquam mollis dolor. Donec
  17. vulputate nunc ut diam. Ut rutrum mi vel sem. Vestibulum
  18. ante ipsum.'''
  19.  
  20. print('Default:')
  21. input = VerboseStringIO(lorem_ipsum)
  22. output = io.StringIO()
  23. shutil.copyfileobj(input, output)
  24.  
  25. print()
  26.  
  27. print('All at once:')
  28. input = VerboseStringIO(lorem_ipsum)
  29. output = io.StringIO()
  30. shutil.copyfileobj(input, output, -1)
  31.  
  32. print()
  33.  
  34. print('Blocks of 256:')
  35. input = VerboseStringIO(lorem_ipsum)
  36. output = io.StringIO()
  37. shutil.copyfileobj(input, output, 256)

默认行为是使用大数据块读取。使用-1会一次读入所有输入,或者也可以使用其他正数,这会设置特定的块大小。下面这个例子将使用多个不同的块大小来展示效果。

类似于UNIX命令行工具cp,copy()函数会用同样的方式解释输出名。如果指定的目标指示一个目录而不是一个文件,则会使用源文件的基名在该目录中创建一个新文件。 


  1. import glob
  2. import os
  3. import shutil
  4.  
  5. os.mkdir('example')
  6. print('BEFORE:', glob.glob('example/*'))
  7.  
  8. shutil.copy('shutil_copy.py', 'example')
  9.  
  10. print('AFTER :', glob.glob('example/*'))

一同复制文件的权限与内容。

copy2()的工作类似于copy(),不过会在复制到新文件的元数据中包含访问的修改时间。 


  1. import os
  2. import shutil
  3. import time
  4.  
  5. def show_file_info(filename):
  6. stat_info = os.stat(filename)
  7. print(' Mode :', oct(stat_info.st_mode))
  8. print(' Created :', time.ctime(stat_info.st_ctime))
  9. print(' Accessed:', time.ctime(stat_info.st_atime))
  10. print(' Modified:', time.ctime(stat_info.st_mtime))
  11.  
  12. os.mkdir('example')
  13. print('SOURCE:')
  14. show_file_info('shutil_copy2.py')
  15.  
  16. shutil.copy2('shutil_copy2.py', 'example')
  17.  
  18. print('DEST:')
  19. show_file_info('example/shutil_copy2.py')

这个新文件的所有特性读与原文件完全相同。

1.2 复制文件元数据

默认的,在UNIX下创建一个新的文件时,它会根据当前用户的umask接受权限。要把权限从一个文件复制到另一个文件,可以使用copymode()。


  1. import os