Python的shutil模块中文件的复制操作函数详解
作者:lucifercn 发布时间:2023-04-13 16:59:22
copy()
chutil.copy(source, destination)
shutil.copy() 函数实现文件复制功能,将 source 文件复制到 destination 文件夹中,两个参数都是字符串格式。如果 destination 是一个文件名称,那么它会被用来当作复制后的文件名称,即等于 复制 + 重命名。举例如下:
>> import shutil
>> import os
>> os.chdir('C:\\')
>> shutil.copy('C:\\spam.txt', 'C:\\delicious')
'C:\\delicious\\spam.txt'
>> shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt')
'C:\\delicious\\eggs2.txt'
如代码所示,该函数的返回值是复制成功后的字符串格式的文件路径。
copyfile()
copyfile()将源的内容复制给目标,如果没有权限写目标文件则产生IoError
from shutil import *
from glob import glob
print 'BEFORE:', glob('huanhuan.*')
copyfile('huanhuan.txt', 'huanhuan.txt.copy')
print 'AFTER:', glob('huanhuan.*')
这个函数会打开输入文件进行读写,而不论其类型,所以某些特殊文件不可以用copyfile()复制为新的特殊文件。
>>> ================================ RESTART ================================
>>>
BEFORE: ['huanhuan.txt']
AFTER: ['huanhuan.txt', 'huanhuan.txt.copy']
copyfile()实际是使用了底层函数copyfileobj()。copyfile()的参数是文件名,copyfileobj()的参数是打开的文件句柄。第三个参数可选,用于读入块的缓冲区长度。
from shutil import *
import os
from StringIO import StringIO
import sys
class VerboseStringIO(StringIO):
def read(self, n=-1):
next = StringIO.read(self, n)
print 'read(%d) bytes' % n
return next
lorem_ipsum = '''This makes the dependency explicit, limits the scope to the current file and provides faster access to the bit.* functions, too.
It's good programming practice not to rely on the global variable bit being set (assuming some other part of your application has already loaded the module).
The require function ensures the module is only loaded once, in any case.'''
print 'Defalut:'
input = VerboseStringIO(lorem_ipsum)
output = StringIO()
copyfileobj(input, output)
print 'All at once:'
input = VerboseStringIO(lorem_ipsum)
output = StringIO()
copyfileobj(input, output, -1)
print 'Blocks of 256:'
input = VerboseStringIO(lorem_ipsum)
output = StringIO()
copyfileobj(input, output, 256)
默认行为是使用大数据块读取。使用-1会一次性读取所有输入,或者使用其他正数可以设置特定块的大小。
>>> ================================ RESTART ================================
>>>
Defalut:
read(16384) bytes
read(16384) bytes
All at once:
read(-1) bytes
read(-1) bytes
Blocks of 256:
read(256) bytes
read(256) bytes
read(256) bytes
类似于UNIX命令行工具cp,copy()函数会用同样的方式解释输出名。如果指定的目标指示一个目录而不是一个文件,会使用源文件的基名在该目录中创建一个新文件。
from shutil import *
import os
dir = os.getcwd()
if not os.path.exists('%s\\example' % dir):
os.mkdir('%s\\example' % dir)
print 'BEFORE:', os.listdir('example')
copy('huanhuan.txt', 'example')
print 'AFTER:', os.listdir('example')
>>> ================================ RESTART ================================
>>>
BEFORE: []
AFTER: ['huanhuan.txt']
copy2()
copy2()工作类似copy(),不过复制到新文件的元数据会包含访问和修改时间。
from shutil import *
import os
import time
dir = os.getcwd()
if not os.path.exists('%s\\example' % dir):
os.mkdir('%s\\example' % dir)
def show_file_info(filename):
stat_info = os.stat(filename)
print '\tMode :', stat_info.st_mode
print '\tCreated :', time.ctime(stat_info.st_ctime)
print '\tAccessed:', time.ctime(stat_info.st_atime)
print '\tModified:', time.ctime(stat_info.st_mtime)
print 'SOURCE:'
show_file_info('huanhuan.txt')
copy2('huanhuan.txt', 'example')
print 'DEST:'
show_file_info('%s\\example\\huanhuan.txt' % dir)
文件特性和原文件完全相同。
>>> ================================ RESTART ================================
>>>
SOURCE:
Mode : 33206
Created : Thu Feb 13 17:42:46 2014
Accessed: Thu Feb 13 17:42:46 2014
Modified: Thu Feb 13 17:42:46 2014
DEST:
Mode : 33206
Created : Thu Feb 13 18:29:14 2014
Accessed: Thu Feb 13 17:42:46 2014
Modified: Thu Feb 13 17:42:46 2014
复制文件元数据
在UNIX创建一个新文件,会根据当前用户的umask接受权限。要把权限从一个文件复制到另一个文件,可以使用copymode()。
from shutil import *
import os
from commands import *
with open('file_to_change.txt', 'wt') as f:
f.write('i love you')
os.chmod('file_to_change.txt', 0444)
print 'BEFORE:'
print getstatus('file_to_change.txt')
copymode('shutil_copymode.py', 'file_to_change.txt')
print 'AFTER:'
print getstatus('file_to_change.txt')
要复制其他元数据,可以使用copystat()。
from shutil import *
import os
import time
def show_file_info(filename):
stat_info = os.stat(filename)
print '\tMode :', stat_info.st_mode
print '\tCreated :', time.ctime(stat_info.st_ctime)
print '\tAccessed :', time.ctime(stat_info.st_atime)
print '\tModified :', time.ctime(stat_info.st_mtime)
with open('file_to_change.txt', 'wt') as f:
f.write('i love you')
os.chmod('file_to_Change.txt', 0444)
print 'BEFORE:'
show_file_info('file_to_Change.txt')
copystat('shutil_copystat.py', 'file_to_Change.txt')
print 'AFTER:'
show_file_info('file_to_Change.txt')
使用copystat()只会复制与文件关联的权限和日期。
处理目录树
shutil包含三个函数处理目录树。要把一个目录从一个位置复制到另一个位置,使用copytree()。这会递归遍历源目录树,将文件复制到目标。
copytree()可以将当前这个实现当作起点,在使用前要让它更健壮,可以增加一些特性,如进度条。
from shutil import *
from commands import *
print 'BEFORE:'
print getoutput('ls -rlast /tmp/example')
copytree('../shutil', '/tmp/example')
print '\nAFTER:'
print getoutput('ls -rlast /tmp/example')
symlinks参数控制着符号链接作为链接复制还是文件复制。默认将内容复制到新文件,如果选项为true,会在目标中创建新的符号链接。
要删除一个目录及其内容,可以使用rmtree()。
from shutil import *
from commands import *
print 'BEFORE:'
print getoutput('ls -rlast /tmp/example')
rmtree('/tmp/example')
print '\nAFTER:'
print getoutput('ls -rlast /tmp/example')
将一个文件或目录从一个位置移动到另一个位置,可以使用move()。
from shutil import *
from glob import glob
with open('example.txt', 'wt') as f:
f.write('i love you')
print 'BEFORE: ', glob('example*')
move('example.txt', 'example.out')
print 'AFTER: ',glob('example*')
其语义与UNIX命令mv类似。如果源与目标都在同一个文件系统内,则会重命名源文件。否则,源文件会复制到目标文件,将源文件删除。
>>> ================================ RESTART ================================
>>>
BEFORE: ['example', 'example.txt']
AFTER: ['example', 'example.out']
猜你喜欢
- Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field.示
- Oracle shutdown的时候突然断电,导致使用sql/plus启动时无法连接到数据库,具体描述为:connection can no
- --程序员们在编写一个雇员报表,他们需要得到每个雇员当前及历史工资状态的信息, --以便生成报表。报表需要显示每个人的晋升日期和工资数目。
- 大家好,我们经常会有这样的需求。比如下图我们需要把同一个省份的合并起来,如下图的效果如何实现呢,这是原有的df直观的操作是这样的:df.to
- 隐写术是在任何文件中隐藏秘密数据的艺术。秘密数据可以是任何格式的数据,如文本甚至文件。简而言之,隐写术的主要目的是隐藏任何文件(通常是图像、
- 下载编译器protoc两种方式:1、使用google官方protoc下载地址:https://github.com/google/proto
- 前言目前,Golang 可以认为是服务器开发语言发展的趋势之一,特别是在流媒体服务器开发中,已经占有一席之地。很多音视频技术服务提供商也大多
- 序言哈喽兄弟们,今天来实现一个Python采集视频、弹幕、评论与一体的小软件。平常咱们都是直接代码运行,不过今天我们做成软件,这样的话,咱们
- 模块介绍Python提供了importlib包作为标准库的一部分。目的就是提供Python中import语句的实现(以及__import__
- 1. 引言在本文中,我们将研究从列表中选择随机元素的不同实现方法。在日常项目中,我们经常会遇到这种情形,比如随机从多种数据增强策略中选择一种
- 线程池线程池的创建 - concurrentconcurrent 是 Python 的内置包,使用它可以帮助我们完成创建线程池的任
- 一切从一个糟糕的浏览器开始,它完全不支持 XHTML。什么是 MIME Type? 为什么这么说呢?首先,我们要了解浏览器是如何处理内容的。
- 1.Order By原理MySQL的Order By操作用于排序,并且会有多种不同的排序算法,他们的性能都是不一样的。假设有一个表,建表的s
- 本文实例为大家分享了Vue实现计时器的具体代码,供大家参考,具体内容如下功能简介:1、初始值为0,点击【加】按钮,数字自+1;连续点击【加】
- 效果图实现代码vue2 代码如下<!-- 横向柱状图测试结果 --><template> <div
- 日志日志是跟踪软件运行时所发生的事件的一种方法。软件开发者在代码中调用日志函数,表明发生了特定的事件。事件由描述性消息描述,该描述性消息可以
- 最近开发的telemetry采集系统上线了。听起来高大上,简单来说就是一个grpc/udp服务端,用户的机器(路由器、交换机)将它们的各种统
- 在使用PyTorch做实验时经常会用到生成随机数Tensor的方法,比如:torch.rand()torch.randn()torch.no
- 本文实例讲述了python自定义类并使用的方法。分享给大家供大家参考。具体如下:class Person: def __init
- 如下所示:#抽象 (函数)# 1、callable 判断一个对象是否可以被调用x = 1def y(): &nbs