python-os系统模块_shutil模块_os.path模块_tarfile压缩模块

python 模块学习

7. os 模块

1. os 模块的内置方法

os 模块: 对系统进行操作

import os => 导入 os 模块

system() 在python中执行系统命令
import os

# linux
os.system("ifconfig")
os.system("touch 1.txt")
os.system("rm -rf 1.txt")

# windows
os.system("ipconfig")
popen() 执行系统命令返回对象,通过 read 方法读出字符串 (防止字符串乱码,使用 popen 进行操作)

​ 在 windows 操作系统中默认的是 gbk 编码集 , 显示的时候 , 按照 utf-8 进行转换

obj = os.popen("ifconfig")
obj = os.popen("ipconfig")
res = obj.read()
print(res)
listdir() 获取指定文件夹中所有内容的名称列表
lst = os.listdir(".")  # . 当前目录
lst = os.listdir("..") # .. 上一级目录
lst = os.listdir("/home/lifei/") # 指定文件夹
print(lst)
getcwd() 获取当前文件所在的默认路径 (单纯的路径)
res = os.getcwd()
print(res)

# 路径 + 文件
print(__file__)
chdir() 修改当前文件工作的默认路径
os.chdir("/home/lifei/mywork")
os.system("mkdir ceshi1")
os.system("rm -rd ceshi1")
environ 获取或修改环境变量
print(os.environ)
"""
environ({'PATH': '/home/lifei/bin:/home/lifei/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin', 'XAUTHORITY': '/home/lifei/.Xauthority', 'XMODIFIERS': '@im=fcitx', 'XDG_DATA_DIRS': '/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop', 'GDMSESSION': 'ubuntu', 'MANDATORY_PATH': '/usr/share/gconf/ubuntu.mandatory.path', 'GTK_IM_MODULE': 'fcitx', 'DBUS_SESSION_BUS_ADDRESS': 'unix:abstract=/tmp/dbus-Z11tBr8NC3', 'DEFAULTS_PATH': '/usr/share/gconf/ubuntu.default.path', 'XDG_CURRENT_DESKTOP': 'Unity', 'UPSTART_SESSION': 'unix:abstract=/com/ubuntu/upstart-session/1000/1730', 'QT4_IM_MODULE': 'fcitx', 'QT_LINUX_ACCESSIBILITY_ALWAYS_ON': '1', 'LOGNAME': 'lifei', 'JOB': 'unity-settings-daemon', 'PWD': '/mnt/hgfs/python_share', 'IM_CONFIG_PHASE': '1', 'PYCHARM_HOSTED': '1', 'LANGUAGE': 'zh_CN:zh', 'PYTHONPATH': '/home/lifei/PycharmProjects/untitled', 'SHELL': '/bin/bash', 'GIO_LAUNCHED_DESKTOP_FILE': '/home/lifei/.local/share/applications/jetbrains-pycharm-ce.desktop', 'INSTANCE': '', 'GTK2_MODULES': 'overlay-scrollbar', 'UPSTART_INSTANCE': '', 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated', 'GTK_MODULES': 'gail:atk-bridge:unity-gtk-module', 'CLUTTER_IM_MODULE': 'xim', 'XDG_SESSION_PATH': '/org/freedesktop/DisplayManager/Session0', 'COMPIZ_BIN_PATH': '/usr/bin/', 'SESSIONTYPE': 'gnome-session', 'XDG_SESSION_DESKTOP': 'ubuntu', 'SHLVL': '0', 'COMPIZ_CONFIG_PROFILE': 'ubuntu', 'UPSTART_JOB': 'unity7', 'QT_IM_MODULE': 'fcitx', 'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg', 'GNOME_KEYRING_CONTROL': '', 'LANG': 'zh_CN.UTF-8', 'XDG_SEAT_PATH': '/org/freedesktop/DisplayManager/Seat0', 'XDG_SESSION_TYPE': 'x11', 'XDG_SESSION_ID': 'c2', 'DISPLAY': ':0', 'GDM_LANG': 'zh_CN', 'PYTHONIOENCODING': 'UTF-8', 'XDG_GREETER_DATA_DIR': '/var/lib/lightdm-data/lifei', 'UPSTART_EVENTS': 'xsession started', 'SESSION': 'ubuntu', 'GPG_AGENT_INFO': '/home/lifei/.gnupg/S.gpg-agent:0:1', 'DESKTOP_SESSION': 'ubuntu', 'USER': 'lifei', 'GIO_LAUNCHED_DESKTOP_FILE_PID': '2377', 'QT_ACCESSIBILITY': '1', 'SSH_AUTH_SOCK': '/run/user/1000/keyring/ssh', 'XDG_SEAT': 'seat0', 'PYTHONUNBUFFERED': '1', 'QT_QPA_PLATFORMTHEME': 'appmenu-qt5', 'XDG_RUNTIME_DIR': '/run/user/1000', 'XDG_VTNR': '7', 'HOME': '/home/lifei', 'GNOME_KEYRING_PID': ''})
"""
"""
通过系统的环境变量 path , 自动找该命令的路径
[windows]
1.右键QQ -> 看一眼QQ所在的路径,复制路径
2.右键我的电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 编辑path环境变量 -> 新建添加即可
3.打开cmd -> QQScLauncher.exe -> 通过命令打开QQ

[linux]
1.在/home/lifei/ -> mkdir mywork -> touch lifei.sh
2.nano lifei.sh -> ifconfig
3.chmod 777 lifei.sh -> ./lifei.sh -> 产生效果
4.把lifei所在的路径添加到linux的环境变量path当中(系统可以自动查询到lifei命令的路径)
5.os.environ["PATH"] += ":/home/lifei/mywork"
6.os.system("lifei.sh")
"""
print(os.environ["PATH"])
os.environ["PATH"] += ":/home/lifei/mywork"
os.system("lifei")

2. os 模块属性

name 获取系统标识

linux,mac -> posix windows -> nt

print(os.name)
sep 获取路径分割符号

**linux,mac -> / windows -> \ **

print(os.sep)
linesep 获取系统的换行符号

linux,mac -> \n windows -> \r\n 或 \n

print(repr(os.linesep))

3. os 模块 对文件的操作

os 模块具有 新建/删除 文件/目录(文件夹) 的功能

os.mknod 创建文件
os.mknod("1.txt")
os.remove 删除文件
os.remove("1.txt")
os.mkdir 创建目录(文件夹)
os.mkdir("ceshi101")
os.rmdir 删除目录(文件夹)
os.rmdir("ceshi101")
os.rename 对文件/目录重命名
os.rename("1.txt","123.py")
os.makedirs 递归创建文件夹
os.makedirs("a/b/c/d/e")
os.removedirs 递归删除文件夹(空文件夹)
os.removedirs("a/b/c/d/e")

8. shutil 模块

shutil 模块具有 复制/移动 文件/目录(文件夹) 的功能

import shutil => 导入 shutil 模块

1. 单纯复制文件的内容

copyfileobj(fsrc , fdst[, length=16*1024]) 单纯的复制文件 (length的单位是字符,表达一次读多少字符)

import shutil

fp1 = open("111.txt",mode="r",encoding="utf-8")
fp2 = open("222.php",mode="w",encoding="utf-8")
shutil.copyfileobj(fp1,fp2)

copyfile(src,dst) 单纯的复制文件内容 , 底层调用的是 copyfileobj

shutil.copyfile("lianxi1.py","lianxi2.py")

2. 单纯复制文件的权限

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

shutil.copymode("123.py","456.py")

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

shutil.copystat("123.py","789.py")

3. 复制文件内容 + 文件权限

copy(src,dst) 复制文件权限和内容

shutil.copy("456.py","ceshi222.txt")

copy2(src,dst) 复制文件权限和内容 , 还包括权限 , 组 , 用户 , 时间等

shutil.copy2("456.py","ceshi333.php")

4. 复制/删除/移动 文件和文件夹

copytree(src,dst) 拷贝文件夹里所有内容(递归拷贝)

shutil.copytree("share01","share02")

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

shutil.rmtree("share02")

move(path1,path2) 移动文件或者文件夹

shutil.move("ceshi333.php","..")
shutil.move("share01","../share001") # 移动并改名

9. os.path 路径模块

1. 内置方法

import os => 导入 os 模块

basename() 返回文件名部分

import os

strvar = "/home/lifei/mywork/ceshi001.py"
res = os.path.basename(strvar)
print(res) # ceshi001.py

dirname() 返回路径部分

res = os.path.dirname(strvar)
print(res) # /home/lifei/mywork

split() 将路径拆分成单独的文件部分和路径部分 组成一个元组

tup = os.path.split(strvar)
print(tup) # ('/home/lifei/mywork', 'ceshi001.py')

**join() 将多个路径和文件组成新的路径 可以自动通过不同的系统加不同的斜杠 linux / windows \ **

path1 = "ceshi01"
path2 = "lifei"
path3 = "lianxi01.py"
pathvar = path1 + os.sep + path2 + os.sep + path3
pathvar = os.path.join(path1,path2,path3)
print(pathvar) # ceshi01/lifei/lianxi01.py

splitext() 将路径分割为后缀和其他部分

strvar = "/home/lifei/mywork/ceshi001.py"
res = os.path.splitext(strvar)
print(res) # ('/home/lifei/mywork/ceshi001', '.py')

# 可以使用 split 切割出后缀
lst = strvar.split(".")
print(lst) # ['/home/lifei/mywork/ceshi001', 'py']

getsize() 获取文件的大小

res = os.path.getsize("ceshi1.py")
print(res)

# 文件夹不能计算 
res = os.path.getsize("mywork")

isdir() 检测路径是否是一个文件夹

strvar = "/home/lifei/mywork/lifei"
res = os.path.isdir(strvar)
print(res)

isfile() 检测路径是否是一个文件

strvar = "/home/lifei/mywork/lifei"
res = os.path.isfile(strvar)
print(res)

islink() 检测路径是否是一个链接

strvar = "/home/lifei/mywork/lifei"
res = os.path.islink(strvar)
print(res)

getctime() [windows] 文件的创建时间 , [linux] 权限的改动时间 (返回时间戳)

"""linux 系统中: stat 文件 查看当前文件的时间属性"""
import time
import os

os.chdir("/home/lifei/mywork")
res = os.path.getctime("111.py")

str_time = time.ctime(res)
print(str_time)

getmtime() 获取文件最后一次的修改时间 (返回时间戳)

res = os.path.getmtime("111.py")

getatime() 获取文件最后一次的访问时间(返回时间戳)

res = os.path.getatime("111.py")

exists() 检测指定的路径是否存在

strvar = "/home/lifei/mywork/lifei123456"
res = os.path.exists(strvar)
print(res)

isabs() 检测一个路径是否是绝对路径

pathvar = "."
res = os.path.isabs(pathvar)
print(res)

abspath() 将相对路径转化为绝对路径

pathvar = "."
pathnew = os.path.abspath(pathvar)
print(pathnew) # /mnt/hgfs/python_share

if not os.path.isabs(pathvar):
	pathnew = os.path.abspath(pathvar)
	print(pathnew)    

2. 练习

计算文件夹大小
import os

pathvar = "/mnt/hgfs/python_share/ceshi01"

# 基本写法
lst = os.listdir(pathvar)
print(lst) # ['1.txt', '2.txt', '3.txt', 'lianxi001']

size = 0
for i in lst:
	# 拼接路径
	pathnew1 = os.path.join(pathvar,i)
	# 判断是否是文件
	if os.path.isfile(pathnew1):
		print(i,"[文件]")
		size += os.path.getsize(pathnew1)
	# 判断是否是文件夹
	elif os.path.isdir(pathnew1):
		print(i,"[文件夹]")
		for j in i:
			pathnew2 = os.path.join(pathnew1,j)
			if os.path.isfile(pathnew2):
				print(j,"[文件]")
				size += os.path.getsize(pathnew2)
print(size)

"""不确定有多少层级的情况下,使用递归"""
# 递归计算
def getallsize(pathvar):
	size = 0
	# 获取当前文件夹中所有内容
	lst = os.listdir(pathvar)
	# 循环列表
	for i in lst:
		# 拼接完整路径
		pathnew = os.path.join(pathvar,i)
		# 判断是否是文件或者文件夹
		if os.path.isfile(pathnew):
			size += os.path.getsize(pathnew)
		elif os.path.isdir(pathnew):
			# 如果是文件夹,继续调用函数
			size += getallsize(pathnew)
	# 返回最后的结果
	return size
res = getallsize(pathvar)
print(res)

10. tarfile 压缩模块

tarfile 后缀: .tar | .tar.gz | .tar.bz2

import tarfile => 导入 tarfile 模块

注意: 最小的压缩包,后缀格式为 .tar.bz2

1. 创建压缩包

import tarfile

# 单纯的 tar 包
tf = tarfile.open("ceshi0730_1.tar","w",encoding="utf-8")
tf.add("/bin/echo","echo")
tf.add("/bin/ed","ed")
tf.add("/bin/fuser","/tmp/fuser")
tf.close()

# .tar.gz
tf = tarfile.open("ceshi0730_2.tar.gz","w:gz",encoding="utf-8")
tf.add("/bin/echo","echo")
tf.add("/bin/ed","ed")
tf.add("/bin/fuser","/tmp/fuser")
tf.close()

# .tar.bz2
tf = tarfile.open("ceshi0730_3.tar.bz2","w:bz2",encoding="utf-8")
tf.add("/bin/echo","echo")
tf.add("/bin/ed","ed")
tf.add("/bin/fuser","/tmp/fuser")
tf.close()

2. 解压压缩包

tf = tarfile.open("ceshi0730_3.tar.bz2","r",encoding="utf-8")
# 解压单个文件
tf.extract("echo","ceshi0730_4")
# 解压所有文件
tf.extractall("ceshi0730_3")
tf.close()

3. 已有压缩包追加文件

特点: 支持 with 语法 , 只能为没有压缩过的 tar 包进行追加

with tarfile.open("ceshi0730_1.tar","a",encoding="utf-8") as tf:
    tf.add("/bin/cp","cp")

4. 查看压缩包中的文件

with tarfile.open("ceshi0730_2.tar.gz","r",encoding="utf-8") as tf:
    lst = tf.getnames()
    print(lst)

5. 拓展: 压缩包追加文件

"""如何处理 tarfile 不能在已经压缩过的压缩包中追加内容的问题"""

import os

# 找到要解压的包的路径
path = os.getcwd()
pathvar1 = os.path.join(path,"ceshi0730_3.tar.bz2")
print(pathvar1)
# 解压到哪里去
pathvar2 = os.path.join(path,"ceshi0730_001")
print(pathvar2)

# 1. 先对已经压缩过的包进行解压
with tarfile.open(pathvar1,"r",encoding="utf-8") as tf:
    tf.extractall(pathvar2)

# 2. 往这个解压的文件夹中添加新的文件
mybin = "cp -a /bin/fgrep " + pathvar2
os.system(mybin)

# 3. 对这个解压的文件夹进行过滤筛选,重新打包压缩 (不要echo)
lst = os.listdir(pathvar2)
print(lst)
with tarfile.open(pathvar1,"w:bz2",encoding="utf-8") as tf:
    for i in lst:
        if i != "echo":
            # 拼接完整路径
            pathnew = os.path.join(pathvar2,i)
            # add(路径,别名)
            tf.add(pathnew,i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I believe I can fly~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值