python中shutil.copyfile的用法_Python的shutil zipfile tarfile模块学习

shutil 模块

shutil.copyfileobj(fsrc, fdst[, length=16*1024]) #copy文件内容到另一个文件,可以copy指定大小的内容

文件拷贝操作

shutil.copyfile(src,dst) #copy文件内容,是不是感觉上面的文件复制很麻烦?还需要自己手动用open函数打开文件,在这里就不需要了,事实上,copyfile调用了copyfileobj

shutil.copymode(src,dst) #仅copy权限,不更改文件内容,组和用户。

shutil.copystat(src,dst) #复制所有的状态信息,包括权限,组,用户,时间等

shutil.copy(src,dst) #复制文件的内容以及权限,先copyfile后copymode

shutil.copy2(src,dst) #建议使用这个来拷贝,复制文件的内容以及文件的所有状态信息。先copyfile后copystat

示例:shutil.copy2('/tmp/123.txt','/tmp/mysql/123.txt')

目录操作

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,ignore_dangling_symlinks=False) #递归的复制文件内容及状态信息,目标目录不需要预先创建

shutil.rmtree(path, ignore_errors=False, οnerrοr=None) #递归地删除文件

示例shutil.copytree('/tmp/mysql','/tmp/mysql2') mysql2这个目标目录不需要预先创建

剪切文件操作

shutil.move(src, dst) #递归的移动文件

示例:shutil.move('/tmp/mysql','/tmp/mysql2') 在同一个目录下,对于目录就是改名,mysql2这个目标目录不需要预先创建

shutil.move('/tmp/mysql2/123.txt','/tmp/mysql3/123.txt') 对于文件就是剪切

批量打包压缩操作

make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None) #压缩打包

base_name: 压缩打包后的文件名或者路径名

format: 压缩或者打包格式 "zip", "tar", "bztar"or "gztar"

root_dir : 将哪个目录或者文件打包(也就是源文件)

base_dir : 将哪个目录或者文件打包(也就是源文件)

root_dir 和 base_dir 默认设置为当前目录,root_dir 和 base_dir 一般可以认为是一样的

shutil.make_archive('tarball','gztar',root_dir='/tmp/mysql')

zipfile模块

ZipFile类

zipfile.ZipFile(zipfilename, 'a')

a:添加文件到压缩包

r:读取压缩包内容

w:生成一个压缩包

ZipFile.write(filename, arcname, compress_type)

arcname:使用ZipFile.write增加文件时,会把文件本身的路径也加进去,加上arcname就能根据自己的命名规则将文件加入zip包

ZipFile.extractall(path, members, pwd)

path:解压到指定目录

members:只解压压缩包里某个文件

pwd:指定压缩包里的解压密码,zip可以加密压缩

注意:python2.6不支持with xx as的写法,不管是zipfile 还是 tarfile 模块

z = zipfile.ZipFile('/tmp/aa.zip','w',zipfile.ZIP_DEFLATED)

z.write('/tmp/aa.py')

z.close()

python2.6不支持with xx as的写法github地址:https://github.com/mgedmin/check-manifest/issues/22

示例

压缩单个文件

如果要对文件进行压缩,zlib模块是必须的,如果zlib可以使用,你可以使用zipfile.ZIP_DEFLATED设置压缩模式为单个文件或者归档一个整体。

默认的压缩模式是zipfile.ZIP_STORED。import zipfile

import os

with zipfile.ZipFile('/tmp/aa.zip','w',zipfile.ZIP_DEFLATED) as z:

z.write('/tmp/aa.py')

或z = zipfile.ZipFile('/tmp/aa.zip','w',zipfile.ZIP_DEFLATED)

z.write('/tmp/aa.py')

z.close()

解压文件with zipfile.ZipFile('/tmp/123.zip', 'r') as z:

z.extractall(path='/tmp/') # 解压全部,可设置解压路径

递归压缩某个目录下所有文件

def compress_file(zipfilename, dirname): # zipfilename是压缩包名字,dirname是要打包的目录

if os.path.isfile(dirname):

with zipfile.ZipFile(zipfilename, 'w') as z:

z.write(dirname)

else:

with zipfile.ZipFile(zipfilename, 'w') as z:

for root, dirs, files in os.walk(dirname):

for single_file in files:

if single_file != zipfilename:

filepath = os.path.join(root, single_file)

z.write(filepath)

compress_file('a.zip', '.') # 执行函数

添加文件到已有的zip包中

def addfile(zipfilename, dirname):

if os.path.isfile(dirname):

with zipfile.ZipFile(zipfilename, 'a') as z:

z.write(dirname)

else:

with zipfile.ZipFile(zipfilename, 'a') as z:

for root, dirs, files in os.walk(dirname):

for single_file in files:

if single_file != zipfilename:

filepath = os.path.join(root, single_file)

z.write(filepath)

addfile('a.zip', 'test.txt')

查看压缩包中的文件

def viewfile(zipfilename):

with zipfile.ZipFile(zipfilename, 'r') as z:

print(z.namelist())

print(z.namelist()) # 查看压缩包中的文件列表

print(z.read(z.namelist()[0])) # 读出来压缩包中的第一个文件的内容打印到屏幕,也可保存到文件中

viewfile('a.zip')

tarfile模块

添加了arcname不会将文件所在目录tmp添加到压缩包里,解压出来会把文件直接解压到当前文件夹

不添加arcname则会将文件所在目录tmp也添加到压缩包里,解压出来会把tmp解压出来,所以文件放在tmp目录下

建议是不添加arcname,这样解压出来就不会把所有文件解压在当前目录很混乱,mysql压缩包也是这种做法

mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz

t = tarfile.open('/tmp/a.tgz', 'w:gz')

t.add('/tmp/aa.py',arcname='aa.py')

t.add('/tmp/22.txt',arcname='22.txt')

t.close()

tar -tf a.tgz

aa.py

22.txt

t = tarfile.open('/tmp/a.tgz', 'w:gz')

t.add('/tmp/aa.py')

t.add('/tmp/22.txt')

t.close()

tar -tf a.tgz

tmp/aa.py

tmp/22.txt

注意:python2.6不支持with xx as的写法,不管是zipfile 还是 tarfile 模块

t = tarfile.open('/tmp/a.tgz', 'w:gz')

t.add('/tmp/aa.py',arcname='aa.py')

t.add('/tmp/22.txt',arcname='22.txt')

t.close()

python2.6不支持with xx as的写法github地址:https://github.com/mgedmin/check-manifest/issues/22

tarfile.open(name=None, mode=’r’, fileobj=None, bufsize=10240, **kwargs)

在打包的过程中可以设置压缩规则,如想要以gz压缩的格式打包

tar=tarfile.open('/path/to/your.tar.gz','w:gz')

其他格式如下表:

tarfile.open的mode有很多种:

mode action

'r' or 'r:*' Open for reading with transparent compression (recommended).

'r:' Open for reading exclusively without compression.

'r:gz' Open for reading with gzip compression.

'r:bz2' Open for reading with bzip2 compression.

'a' or 'a:' Open for appending with no compression. The file is created if it does not exist.

'w' or 'w:' Open for uncompressed writing.

'w:gz' Open for gzip compressed writing.

'w:bz2' Open for bzip2 compressed writing.

TarFile.add(name, arcname=None, recursive=True, exclude=None, filter=None)

name:可以是目录,软连接,文件

recursive:如果name是目录则递归压缩这个目录,默认是true

arcname:使用tar.add()增加文件时,会把文件本身的路径也加进去,加上arcname就能根据自己的命名规则将文件加入tar包

exclude:已经Deprecated

filter:不压缩某些文件

TarFile.extractall(path='', members=None)

path:解压的路径

members:只解压压缩包里某个文件

示例

压缩单个文件并打包

import tarfile

import os

with tarfile.open('/tmp/a.tgz', 'w:gz') as tar:

tar.add('/tmp/aa.py',arcname='aa.py')

tar.add('/tmp/22.txt',arcname='22.txt')

或t = tarfile.open('/tmp/a.tgz', 'w:gz')

t.add('/tmp/aa.py',arcname='aa.py')

t.add('/tmp/22.txt',arcname='22.txt')

t.close()

解压文件with tarfile.open('a.tar', 'r') as tar:

print(tar.getmembers()) # 查看压缩包内文件成员

tar.extractall(path='/tmp/') # 解压全部

或t = tarfile.open('/data/test/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz', 'r:gz')

print(t.getmembers()) # 查看压缩包内文件成员

t.extractall(path='/data/test/mysql') # 解压全部

t.close()

压缩某个目录下所有文件

def compress_file(tarfilename, dirname): # tarfilename是压缩包名字,dirname是要打包的目录

if os.path.isfile(dirname):

with tarfile.open(tarfilename, 'w') as tar:

tar.add(dirname)

else:

with tarfile.open(tarfilename, 'w') as tar:

for root, dirs, files in os.walk(dirname):

for single_file in files:

# if single_file != tarfilename:

filepath = os.path.join(root, single_file)

tar.add(filepath)

compress_file('test.tar', 'test.txt')

compress_file('t.tar', '.')

添加文件到已有的tar包中

def addfile(tarfilename, dirname): # tarfilename是压缩包名字,dirname是要打包的目录

if os.path.isfile(dirname):

with tarfile.open(tarfilename, 'a') as tar:

tar.add(dirname)

else:

with tarfile.open(tarfilename, 'a') as tar:

for root, dirs, files in os.walk(dirname):

for single_file in files:

# if single_file != tarfilename:

filepath = os.path.join(root, single_file)

tar.add(filepath)

addfile('t.tar', 'ttt.txt')

addfile('t.tar', 'ttt')

如果语法正确,pycharm可以弹出语法提示

因为用的旧的语法,所以可以出来提示

AAffA0nNPuCLAAAAAElFTkSuQmCC

python2.6不能用with xx as语法,所以tar. 不能出来提示

AAffA0nNPuCLAAAAAElFTkSuQmCC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值