第六章:文件系统-shutil:高层文件操作-复制文件

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

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

import glob
import shutil

print('BEFORE:',glob.glob('shutil_copyfile.*'))

shutil.copyfile('shutil_copyfile.py','shutil_copyfile.py.copy')

print('AFTER:',glob.glob('shutil_copyfile.*'))

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

BEFORE: [‘shutil_copyfile.py’, ‘shutil_copyfile.py.copy’]
AFTER: [‘shutil_copyfile.py’, ‘shutil_copyfile.py.copy’]

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

import io
import os
import shutil
import sys

class VerboseStringIO(io.StringIO):

    def read(self,n=-1):
        next = io.StringIO.read(self,n)
        print('read({}) got {} bytes'.format(n,len(next)))
        return next

lorem_ipsum = '''Lorem ipsum dolor sit amet, consectetuer
adipiscing elit. Maecenas porttitor congue massa. Fusce posuere,
magna sed pulvinar ultricies, purus lectus malesuada libero,
sit amet commodo magna eros quis urna. Nunc viverra imperdiet enim.
Fusce est.'''

print('Default:')
input = VerboseStringIO(lorem_ipsum)
output = io.StringIO()
shutil.copyfileobj(input,output)

print()

print('All at once:')
input = VerboseStringIO(lorem_ipsum)
output = io.StringIO()
shutil.copyfileobj(input,output,-1)

print()

print('Blocks of 256:')
input = VerboseStringIO(lorem_ipsum)
output = io.StringIO()
shutil.copyfileobj(input,output,256)

默认行为是使用大数据块读取。使用-1会一次读入所有输入,或者也可以使用其他正数,这会设置特定的块大小。下面这个例子将使用多个不同的块大小来展示效果。
运行结果:
在这里插入图片描述
类似于UNIX命令行工具cp,copy()函数会用同样的方式解释输出名。如果指定的目标指示一个目录而不是一个文件,则会使用源文件的基名在该目录中创建一个新文件。

import glob
import os
import shutil

os.mkdir('example')
print('BEFORE:',glob.glob('example/*'))

shutil.copy('shutil_copy.py','example')

print('AFTER:',glob.glob('example/*'))

一同复制文件的权限与内容。
运行结果:

BEFORE: []
AFTER: [‘example20\shutil_copy.py’]

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

import os
import shutil
import time

def show_file_info(filename):
    stat_info = os.stat(filename)
    print('  Mode    :',oct(stat_info.st_mode))
    print('  Created :',time.ctime(stat_info.st_ctime))
    print('  Accessed:',time.ctime(stat_info.st_atime))
    print('  Modified:',time.ctime(stat_info.st_mtime))

os.mkdir('example2')
print('SOURCE:')
show_file_info('shutil_copy2.py')

shutil.copy2('shutil_copy2.py','example2')

print('DEST:')
show_file_info('example2/shutil_copy2.py')

这个新文件的所有特性都与源文件完全相同。
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/88582415