shutil、zipfile、tarfile的简单应用

shutil 模块简单使用

shutil.copyfileobj(fsrc, fdst,[ length]):拷贝文件句柄,将类文件对象fsrc的内容复制到类文件对象fdst。如果给定整数长度,则为缓冲区大小。如果长度是负值意味着复制数据时不需要以块的形式对源数据进行循环,默认情况下,数据是块读取的,以避免不受控制的内存消耗。注意,如果fsrc对象的当前文件位置不是0,那么只复制从当前文件位置到文件末尾的内容。

如下,拷贝文件操作:

import shutil
with open("test.txt",mode="r",encoding="utf-8") as f1, \
    open("abc",mode="a",encoding="utf-8") as f2:
    shutil.copyfileobj(f1,f2)   # 拷贝文件句柄

拷贝后的数据如下图所示:

python模块shutil_python

shutil.copyfile(src, dst, *, follow_symlinks=True)

src:源文件。

dst:目标文件

*:模式不用管编码方式默认是utf-8

仅拷贝状态的信息,包括:mode bits, atime, mtime, flags

如果follow_symlinks为false, src是一个符号链接(快捷方式),那么将创建一个新的符号链接(快捷方式),而不是复制src指向的文件。

文件拷贝,操作如下:

import shutil
shutil.copyfile("test.txt","abc")

拷贝后如下图所示:

python模块shutil_数据_02

shutil.copymode(src, dst, *, follow_symlinks=True):将src权限复制到dst。文件内容、所有者和组不受影响。如果follow_symlinks为假,并且src和dst都是符号链接,copymode()将尝试修改dst本身的模式(而不是它指向的文件)。此功能并非在每个平台上都可用;有关更多信息,请参见copystat()。如果copymode()不能修改本地平台上的符号链接,并且被要求这样做,那么它将什么也不做并返回。

shutil.copystat(src, dst, *, follow_symlinks=True):将src文件状态拷贝到dst,dst文件必须存在。如上次访问时间、上次修改时间和标志从src复制到dst。在Linux上,copystat()也尽可能地复制“扩展属性”。文件内容、所有者和组不受影响。

如果follow_symlinks为假,并且src和dst都引用符号链接,copystat()将对符号链接本身进行操作,而不是对符号链接引用的文件进行操作,从src符号链接读取信息,并将信息写入dst符号链接。

shutil.copy(src, dst, *, follow_symlinks=True):将文件src复制到文件或目录dst。如果dst指定一个目录,该文件将使用来自src的文件名复制到dst文件夹中,如果dst是文件名将src文件内容复制一份到dst文件中。

拷贝文件test.txt内容到abc中,拷贝test.txt到一个目录下。

import shutil
shutil.copy("test.txt","abc")
shutil.copy("test.txt",r"I:\python_work\test")

拷贝后的内容如下:

python模块shutil_数据_03

shutil.copy2(src, dst, *, follow_symlinks=True):功能与copy相同,但可以试图保存目标文件的原数据,(实验没成功,拷贝后会覆盖原有数据)。

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False):递归复制位于src的整个目录树,返回目标目录。由dst命名的目标目录必须不存在,它将被当做父目录。

import shutil
shutil.copytree("a","z")

如下图示拷贝后的数据:

python模块shutil_拷贝文件_04

shutil.rmtree(pathignore_errors=Falseonerror=None):递归的删除目录,一定要注意在删除时,无论目录是空目录还是有文件的目录,都会不提示的删除,而且删除的数据不经过回收站,无法恢复,所以慎用。

import shutil
shutil.rmtree("z")

shutil.move(srcdstcopy_function=copy2):相当于剪切,如果在同目录下就相当于重命名的操作。

如下面相当于重命名操作,剪切也类似就不演示了。

import shutil
shutil.move("abc","abc.txt")

shutil.disk_usage(path):以命名元组的形式返回给定路径的磁盘使用情况统计信息,属性为total、used和free,即总空间、已用空间和可用空间量(以字节为单位)。在Windows上,路径必须是目录;在UNIX上,路径可以是文件或目录。

import shutil
ret = shutil.disk_usage(r"I:\python_work")
print(ret)   # 打印字节形式

# 打印GB形式的
print("total:",int(ret[0] / (1024 ** 3)),"GB")
print("used:",int(ret[1] / (1024 ** 3)),"GB")
print("free",int(ret[2] / (1024 ** 3)),"GB")

内容如下:

python模块shutil_拷贝文件_05

shutil.chown(path, user=None, group=None):更改文件用户的所有者和用户组。

shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None):返回可以行文件的路径,如下所示:

import shutil
print(shutil.which("cmd"))

# 打印内容如下
C:\Windows\system32\cmd.EXE

shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None):

创建压缩包并返回文件路径,例如:zip、tar。

base_name: 要创建的文件名,如果有路径则将文件保存到路径下,如果没有路径则保存到当前目录下,件名是没有扩展名的。

format:压缩包种类,“zip”, “tar”, “bztar”,“gztar”

root_dir:要被打包的文件路径

base_dir:被打包文件的路径,优先级高于root_dir

owner:用户,默认当前用户

group:组,默认当前组

logger:用于记录日志,通常是logging.Logger对象

如下:

import shutil
shutil.make_archive(base_name=r"I:\test\python_work_zip",
                    format="zip", root_dir=r"I:\test")

打包后的内容如下:

python模块shutil_拷贝文件_06

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的

zipfile模块

压缩文件:

import zipfile
z = zipfile.ZipFile('test.zip', 'w')   # 压缩后的文件名
z.write('test')      # 要被压缩的文件
z.close()     # 关闭zip对象

压缩后的内容如下:

python模块shutil_符号链接_07

解压文件:

import zipfile
z = zipfile.ZipFile('test_1.zip', 'r')    # 要被解压的文件
z.extractall(path=r'I:\test')    # 将提取后的文件保存到路径中
z.close()

解压后的文件如下:

python模块shutil_符号链接_08

tarfile压缩:

import tarfile
t=tarfile.open('test.tar','w')       # 压缩后的名字
t.add('test',arcname='a.bak')    # 要压缩的文件和压缩后将被压缩文件改名为a.bak
t.close()

压缩后的文件内容如下:

python模块shutil_文件名_09

解压:

import tarfile
t=tarfile.open('test.tar','r')   # 要被解压的包
t.extractall(path=r"I:\test")    # 解压后保存的路径
t.close()

解压后内容如下:

python模块shutil_符号链接_10