Python笔记_17_os模块_shutil模块_zipfile模块_tarfile模块_import导包

os模块 新建/删除

文件操作领域:
os => 新建和删除
shutil => 复制和剪切

import os
# 默认更改工作路径
os.chdir("/home/wangwen/mywork")
os.mknod

创建文件

os.mknod("ceshi1014.txt")
os.remove

删除文件

os.remove("ceshi1014.txt")
os.mkdir

创建目录(文件夹)

os.mkdir("ceshi1001")
os.rmdir

删除目录(文件夹)

os.rmdir('ceshi1001')
os.rename

对文件,目录重命名

os.rename("ceshi1001","ceshi1002")
os.makedirs

递归创建文件夹

os.makedirs("a/b/c/d")
os.removedirs

递归删除文件夹(空文件夹)

os.removedirs("./a/b/c/d")

shutil模块 复制/移动

  1. 仅仅复制文件内容的
copyfileobj(fsrc, fdst[, length=16*1024])

复制文件 (length的单位是字符(表达一次读多少字符))

import shutil
fp1 = open("./3.txt","r",encoding="utf-8")
fp2 = open("./4.txt","w",encoding="utf-8")
shutil.copyfileobj(fp1,fp2)
copyfile(src,dst)

单纯的仅复制文件内容 , 底层调用了 copyfileobj

shutil.copyfile("3.txt","5.txt")  # copyfile 如果没有这个文件,自动创建
  1. 仅仅复制权限的
copymode(src,dst)

单纯的仅复制文件权限 , 不包括内容 (虚拟机共享目录都是默认777)

shutil.copymode("3.txt","6.txt")  # copymode 复制权限等操作的时,该文件必须存在
copystat(src,dst)

复制所有状态信息,包括权限,组,用户,修改时间等,不包括内容

shutil.copystat("3.txt","7.txt")
  1. 既复制文件内容 还 复制文件权限的 *****
copy(src,dst)

复制文件权限和内容

shutil.copy("3.txt","8.txt")
copy2(src,dst)

复制文件权限和内容,还包括权限,组,用户,时间等

shutil.copy2("3.txt","9.txt")
  1. 递归拷贝或删除
copytree(src,dst)

拷贝文件夹里所有内容(递归拷贝)

shutil.copytree("/home/wangwen/mywork","/home/wangwen/mywork2")
rmtree(path)

删除当前文件夹及其中所有内容(递归删除)

 shutil.rmtree("/home/wangwen/mywork2")
move(path1,paht2)

移动文件或者文件夹

shutil.move("./ceshi1002","../ceshi10003")

zipfile 压缩模块

zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
ZipFile(路径包名,模式,压缩or打包,可选allowZip64)

  • 功能:创建一个ZipFile对象,表示一个zip文件.
  • 参数:
    • 参数file表示文件的路径或类文件对象(file-like object)
    • 参数mode指示打开zip文件的模式,默认值为r
      r 表示读取已经存在的zip文件
      w 表示新建一个zip文档或覆盖一个已经存在的zip文档
      a 表示将数据追加到一个现存的zip文档中。
    • 参数compression表示在写zip文档时使用的压缩方法
      zipfile.ZIP_STORED 只是存储模式,不会对文件进行压缩,这个是默认值
      zipfile.ZIP_DEFLATED 对文件进行压缩
    • 如果要操作的zip文件大小超过2G,应该将allowZip64设置为True。
  • 创建一个zip压缩包
import zipfile # zip_deflated  代表是压缩的意思
# 打开压缩包
zf = zipfile.ZipFile("ceshi1136.zip","w",zipfile.ZIP_DEFLATED)
print(zf)
# 写入文件
# write("路径","别名")
zf.write("/bin/cat","qqq")
zf.write("/bin/cp","chacl")
zf.write("/bin/chgrp","chgrp")
# 关闭压缩包
zf.close()
  • 解压文件
zf = zipfile.ZipFile("ceshi1136.zip","r")
# extractall("路径")  解压所有文件到一个文件夹当中
zf.extractall("./ceshi1136")
# zf.extract("文件名","路径")  解压单个文件到一个文件夹当中
zf.extract("chgrp","./ceshi1136_2")
zf.close()
  • 追加文件
# zipfile 同样支持with语法
with zipfile.ZipFile("ceshi1136.zip","a",zipfile.ZIP_DEFLATED) as zf:
# 在添加文件的时候,可以动态为该文件创建文件夹
zf.write("/bin/cp","/abd/cp")
  • 查看压缩包中的内容
with zipfile.ZipFile("ceshi1136.zip","r") as zf:
	res = zf.namelist()
print(res)

tarfile 压缩模块

bz2模式的压缩文件较小 根据电脑的不同会差生不同的结果 (理论上:bz2压缩之后更小,按实际情况为标准)

w 单纯的套一个后缀 打包
w:bz2 采用bz2算法 压缩
w:gz 采用gz算法 压缩

import tarfile
  • 创建tarfile 压缩包
tf = tarfile.open("ceshi001.tar","w",encoding="utf-8")
# add(路径,别名) 添加文件到压缩包当中
tf.add("/bin/dash","dash")
tf.add("/bin/dd","dd")
tf.add("/bin/df","/tmp/df")
# 关闭压缩包
tf.close()  # 327680

# 按照gz算法 创建一个.tar.gz的压缩包
tf  = tarfile.open("ceshi001.tar.gz","w:gz",encoding="utf-8")
tf.add("/bin/dash","dash")
tf.add("/bin/dd","dd")
tf.add("/bin/df","/tmp/df")
tf.close()  # 162558

# 按照bz2算法 创建一个.tar.bz2的压缩包
tf = tarfile.open("ceshi001.tar.bz2","w:bz2",encoding="utf-8")
tf.add("/bin/dash","dash")
tf.add("/bin/dd","dd")
tf.add("/bin/df","/tmp/df")
tf.close()  # 147524

理论上:bz2算法压缩包要比gz算法压缩的包小.

  • 解压文件
tf = tarfile.open("ceshi001.tar.gz","r",encoding="utf-8")
# 一次性解压所有
# tf.extractall("ceshi001")
# 解压单个文件
tf.extract("dd","ceshi001_dd")
tf.close()
  • 追加文件

tarfile 有局限性,不能对已经压缩好的包进行追加文件
只能对光打包不压缩的文件(.tar)进行追加

# with tarfile.open("ceshi001.tar.bz2","a",encoding="utf-8") as tf:
with tarfile.open("ceshi001.tar","a",encoding="utf-8") as tf:
	# add(路径,别名)
	tf.add("/bin/sleep","sleep")
  • 查看压缩包中的内容
with tarfile.open("ceshi001.tar","r",encoding="utf-8") as tf:
	res = tf.getnames()
print(res)
对tarfile 的追加进行改写

(1) 把原来的压缩包进行解压
(2) 把要追加的文件塞进去
(3) 重新过滤,重新打包

import os
#__file__
res = os.getcwd() 
path1 = os.path.join(res,"ceshi001.tar.bz2")
path2 = os.path.join(res,"ceshi0011")
print(path1) #/mnt/hgfs/gongxiang_16/day17/ceshi001.tar.gz
print(path2) #/mnt/hgfs/gongxiang_16/day17/ceshi0011

# (1) 把原来的压缩包进行解压
with tarfile.open(path1,mode="r",encoding="utf-8") as tf:
	tf.extractall(path2)
	
# (2) 把要追加的文件塞进去
# os.system("cp -a /bin/login /mnt/hgfs/gongxiang_16/day17/ceshi0011")
os.system("cp -a /bin/login    " + path2)

# (3) 开始过滤,dd这个文件过滤掉不要了
lst = os.listdir(path2)

with tarfile.open(path1,"w:bz2",encoding="utf-8") as tf:
	for i in lst:
		#/mnt/hgfs/gongxiang_16/day17/ceshi0011/dash
		pathnew = os.path.join(path2,i)		
		if i != "dd":
			# add(路径,文件/文件夹)
			tf.add(pathnew,i)

import 导入模块或包

文件是模块 文件夹是包 文件夹里面有很多文件 <==> 包里面有很多模块
import 模块或者包(包是文件夹,模块是文件)
模块不会被重复导入,引入一次终生受益

调用的时候:
模块.变量
模块.函数
模块.类

import module
# 模块.属性(变量)
res = module.xboy
print(res)

# 模块.函数(方法)
module.dog()

# 模块.类
print(module.MyStudent().name)

# 使用别名调用模块当中的成员.
import module as m
print(m.xboy)
m.cat()

import sys
print(sys.path)

# 自定义模块,进行导包
'''
在导包的时候,系统默认先从sys.path这个路径开始寻找,如果找不到,直接报错,
如果想要找到,把相对应的路径插入到sys.path这个列表,系统自动寻找对应模块.
'''
# sys.path.append(r"D:\gongxiang_16\ceshi_module")
# import abcd
# print(abcd.ceshi001)

from … import …

从哪里导入什么什么东西

调用的时候:
直接使用这个变量
直接使用这个函数
直接使用这个类

# 可以导入所有,单个,多个
from module4 import *
...
from module4 import girl  
print(girl)
from module4 import girl as g,boy as b  #多个
print(b)

返回模块名字的魔术属性 __name__
如果当前文件是直接执行的,就是主文件(主进程),返回__main__
如果当前文件是间接执行的,就是子文件(子进程),返回当前文件名(模块名)

if __name__ == "__main__": #if "main" == "__main__"  条件不成立 , 下面的代码不执行,不导入
	# __name__ == __main__ 用来做测试用的, 在被间接导入的时候,下面的代码不需要导入.
	print("这里是测试代码")

直接引入包中的成员
需要在文件夹下面定义__init__.py文件

import导入某个包下某个模块

import package1.module1
import 导入某个包下某个模块 用as起别名
import package1.module1 as pm
print(pm.girl)
from … import … 从哪个包下的哪个模块 具体的导入什么东西
from package1.module2 import * 			   	 #所有
print(boy1)
from package1.module2 import boy1 			 #单个
print(boy1)
from package1.module2 import boy1,lng21,Bf1	 #多个
lng21()
单入口模式 : 只通过主文件来调用分模块内容,分模块不单独执行

分模块不能单独进行调用,统一由主文件main进行调用
模块之间的互相嵌套导入,使用相对路径实现
单入口文件必须和包在同一层级,包里面可以含有各种包和模块

from . import pkg                    # 相对于当前路径引入模块
from .pko2 import ceshi204           # 相对于当前模块引入具体属性
from .. import pkg2_module1          # 相对于上一级引入模块
from ..pkg2_two import pkt1          # 相对于上一级的某个包引入模块
from ..pkg2_two.pkt2 import ceshi209 # 相对于上一级某个包下的某个模块引入某属性

. 当前路径
… 上一级路径
… 上一级的上一级
… 上一级的上一级的上一级
… (这里的点是无限的)
from … import 模块

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值