- 1. os模块
- 2. os_shutil
- 3. os_path
- 4. tarfile压缩模块
- 5. 小练习
# ### os 模块
import os
#system() 在python中执行系统命令
os.system("ifconfig") # linux
# os.system("ipconfig") windows
# os.system("rm -rf ceshi.txt")
#popen() 执行系统命令返回对象,通过read方法读出字符串
"""
obj = os.popen("ipconfig")
print(obj)
print(obj.read())
"""
#listdir() 获取指定文件夹中所有内容的名称列表 ***
lst = os.listdir()
print(lst)
#getcwd() 获取当前文件所在的默认路径 ***
"""/mnt/hgfs/python32_gx/day16"""
# 路径
res = os.getcwd()
print(res)
# 路径 + 文件名 ***
print(__file__)
#chdir() 修改当前文件工作的默认路径
os.chdir("/home/wangwen/mywork")
os.system("touch 2.txt")
#environ 获取或修改环境变量
"""
[windows]
(1)右键qq属性找路径
(2)右键我的电脑属性->高级系统设置->环境变量->path 打开环境变量添加对应路径
(3)cmd => QQScLauncher
[linux]
(1)在家目录中创建个文件夹,里面创建个文件wangwen,写入ifconfig
(2)增加wangwen的可执行权限 chmod 777 wangwen 测试一下 sudo ./wangwen
(3)添加环境变量在os.environ["PATH"] 中拼接wangwen所有的绝对路径
(4)os.system("wangwen")
总结: 环境变量path的好处是,让系统自动的找到该命令的实际路径进行执行;
"""
print(os.environ["PATH"])
"""
environ(
{
'PATH': '/home/wangwen/bin:/home/wangwen/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin',
'XAUTHORITY': '/home/wangwen/.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-5JjXbZOpKC', 'DEFAULTS_PATH': '/usr/share/gconf/ubuntu.default.path',
'XDG_CURRENT_DESKTOP': 'Unity', 'UPSTART_SESSION': 'unix:abstract=/com/ubuntu/upstart-session/1000/1603', 'QT4_IM_MODULE': 'fcitx',
'QT_LINUX_ACCESSIBILITY_ALWAYS_ON': '1', 'LOGNAME': 'wangwen', 'JOB': 'unity-settings-daemon', 'PWD': '/mnt/hgfs/python32_gx/day16',
'IM_CONFIG_PHASE': '1', 'PYCHARM_HOSTED': '1', 'LANGUAGE': 'zh_CN:zh', 'PYTHONPATH': '/home/wangwen/pylianxi', 'SHELL': '/bin/bash', 'GIO_LAUNCHED_DESKTOP_FILE': '/home/wangwen/.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/wangwen',
'UPSTART_EVENTS': 'xsession started', 'SESSION': 'ubuntu', 'GPG_AGENT_INFO': '/home/wangwen/.gnupg/S.gpg-agent:0:1', 'DESKTOP_SESSION': 'ubuntu', 'USER': 'wangwen', 'GIO_LAUNCHED_DESKTOP_FILE_PID': '12487', '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/wangwen', 'GNOME_KEYRING_PID': ''
}
)
"""
os.environ["PATH"] += ":/home/wangwen/mywork"
os.system("wangwen")
#--os 模块属性
#name 获取系统标识 linux,mac ->posix windows -> nt
print(os.name)
#sep 获取路径分割符号 linux,mac -> / window-> ***
print(os.sep)
#linesep 获取系统的换行符号 linux,mac -> n window->rn 或 n
print(repr(os.linesep))
2. os_shutil
# ### os 模块 (文件操作) 新建/删除/
import os
os.chdir("/home/wangwen/mywork")
# -- os模块具有 新建/删除/
#os.mknod 创建文件
# os.mknod("1.txt")
#os.remove 删除文件
# os.remove("1.txt")
#os.mkdir 创建目录(文件夹)
# os.mkdir("ceshi111")
#os.rmdir 删除目录(文件夹)
# os.rmdir("ceshi111")
#os.rename 对文件,目录重命名
# os.rename("2.txt","3.txt")
#os.makedirs 递归创建文件夹
# os.makedirs("a/b/c/d/e/f")
#os.removedirs 递归删除文件夹(空文件夹)
# os.removedirs("a/b/c/d/e/f")
# ### shutil模块 复制/移动/
import shutil
#copyfileobj(fsrc, fdst[, length=16*1024]) 复制文件 (length的单位是字符(表达一次读多少字符/字节))
"""
fp_src = open("3.txt",mode="r",encoding="utf-8")
fp_dst = open("4.txt",mode="w",encoding="utf-8")
shutil.copyfileobj(fp_src,fp_dst)
"""
#copyfile(src,dst) #单纯的仅复制文件内容 , 底层调用了 copyfileobj
# shutil.copyfile("4.txt","5.txt")
#copymode(src,dst) #单纯的仅复制文件权限 , 不包括内容 (虚拟机共享目录都是默认777)
"""注意: 要先有两个文件才可以,不会默认创建"""
shutil.copymode("4.txt","5.txt")
#copystat(src,dst) #复制所有状态信息,包括权限,组,用户,修改时间等,不包括内容
shutil.copystat("4.txt","5.txt")
#copy(src,dst) #复制文件权限和内容
shutil.copy("5.txt","6.py")
#copy2(src,dst) #复制文件权限和内容,还包括权限,组,用户,时间等
shutil.copy2("5.txt","7.py")
#copytree(src,dst) #拷贝文件夹里所有内容(递归拷贝)
# shutil.copytree("lianxi","lianxi2")
#rmtree(path) #删除当前文件夹及其中所有内容(递归删除)
# shutil.rmtree("lianxi2")
#move(path1,paht2) #移动文件或者文件夹
# shutil.move("7.py","lianxi/888.php")
shutil.move("7.py","/888.php")
3. os_path
# ### os.path 路径模块
import os
pathvar = "/home/wangwen/mywork/ceshi.py"
pathvar = __file__
#basename() 返回文件名部分
res = os.path.basename(pathvar)
print(res)
#dirname() 返回路径部分
res = os.path.dirname(pathvar)
print(res)
#split() 将路径拆分成单独的文件部分和路径部分 组合成一个元组
print(os.path.split(__file__))
#join() 将多个路径和文件组成新的路径 可以自动通过不同的系统加不同的斜杠 linux / windows ***
path1 = "home"
path2 = "wangwen"
path3 = "mywork"
pathvar = path1 + os.sep + path2 + os.sep + path3
print(pathvar)
# 用join改造
path_new = os.path.join(path1,path2,path3)
print(path_new)
#splitext() 将路径分割为后缀和其他部分 (了解)
pathvar = "/home/wangwen/mywork/ceshi.py"
print( os.path.splitext(pathvar) )
print( pathvar.split(".")[-1] )
#getsize() 获取文件的大小 ***
# pathvar = os.path.dirname(__file__) # 方法一
pathvar = os.getcwd() # 方法二
path_new = os.path.join(pathvar,"2.py")
print(path_new)
# 计算文件大小
res = os.path.getsize(path_new)
print(pathvar)
res = os.path.getsize("/mnt/hgfs/python32_gx/day14")
print(res)
#isdir() 检测路径是否是一个文件夹 ***
res = os.path.isdir("/mnt/hgfs/python32_gx/day14")
print(res)
#isfile() 检测路径是否是一个文件 ***
res = os.path.isfile("/mnt/hgfs/python32_gx/day16/1.py")
print(res)
#islink() 检测路径数否是一个链接
res = os.path.islink("/home/wangwen/mywork/1122.py")
print(res)
#getctime() [windows]文件的创建时间,[linux]权限的改动时间(返回时间戳)
import time
res = os.path.getctime("/home/wangwen/mywork/4.txt")
#getmtime() 获取文件最后一次修改时间(返回时间戳)
res = os.path.getmtime("/home/wangwen/mywork/4.txt")
#getatime() 获取文件最后一次访问时间(返回时间戳)
res = os.path.getatime("/home/wangwen/mywork/4.txt")
print(res)
print(time.ctime(res))
#exists() 检测指定的路径是否存在 ***
res = os.path.exists("/home/wangwen/mywork/4.txt")
# res = os.path.exists("4.txt")
print(res,"<============>")
#isabs() 检测一个路径是否是绝对路径
res = os.path.isabs("2.py")
print(res)
#abspath() 将相对路径转化为绝对路径
res = os.path.abspath("2.py")
print(res)
pathvar = "2.py"
if not os.path.isabs(pathvar):
abs_path = os.path.abspath("2.py")
print(abs_path)
# ### 作业题 : 计算一个文件夹中的所有文件大小
4. tarfile压缩模块
# ### tarfile 压缩模块
import tarfile
# (1) 压缩文件
# 1.只是单纯的打包.
# 创建压缩包
tf = tarfile.open("ceshi0930_0.tar","w",encoding="utf-8")
# 写入文件
"""add(路径,别名)"""
tf.add("/bin/chown","chown")
tf.add("/bin/cp","cp")
tf.add("/bin/dash","tmp/dash")
# 关闭文件
tf.close() # 378880
# 2.使用gz算法压缩
tf = tarfile.open("ceshi0930_1.tar.gz","w:gz",encoding="utf-8")
# 写入文件
"""add(路径,别名)"""
tf.add("/bin/chown","chown")
tf.add("/bin/cp","cp")
tf.add("/bin/dash","tmp/dash")
# 关闭文件
tf.close() # 180413
# 3.使用bz2算法压缩
tf = tarfile.open("ceshi0930_2.tar.bz2","w:bz2",encoding="utf-8")
# 写入文件
"""add(路径,别名)"""
tf.add("/bin/chown","chown")
tf.add("/bin/cp","cp")
tf.add("/bin/dash","tmp/dash")
# 关闭文件
tf.close() # 163261
# (2) 解压文件
tf = tarfile.open("ceshi0930_1.tar.gz","r",encoding="utf-8")
""" extract(文件,路径) 解压单个文件"""
tf.extract("chown","ceshi0930_1")
""" extract(路径) 解压所有文件"""
tf.extractall("ceshi0930_1_2")
tf.close()
# (3) 追加文件
"""对已经压缩过的包无法进行追加文件,只能是没有压缩过的包进行追加文件"""
tf = tarfile.open("ceshi0930_0.tar","a",encoding="utf-8")
tf.add("/bin/mkdir","mkdir")
tf.close()
# 使用with进行改造
with tarfile.open("ceshi0930_0.tar","a",encoding="utf-8") as tf:
tf.add("/bin/mkdir","mkdir234")
# (4) 查看文件
with tarfile.open("ceshi0930_0.tar","r",encoding="utf-8") as tf:
lst = tf.getnames()
print(lst)
# ### 追加文件到压缩包中在压缩
import os,shutil
"""
1.把已经压缩的包进行解压
2.把要追加的内容放进去
3.过滤文件重新压缩
"""
# 记录压缩包所在的绝对路径
pathvar1 = os.path.abspath("ceshi0930_2.tar.bz2")
# 要解压到哪个文件夹中(绝对路径)
pathvar2 = os.path.join( os.getcwd() , "ceshi0930_2" )
print(pathvar1)# /mnt/hgfs/python32_gx/day16/ceshi0930_2.tar.bz2
print(pathvar2)# /mnt/hgfs/python32_gx/day16/ceshi0930_2
# 1.把已经压缩的包进行解压
with tarfile.open(pathvar1,"r",encoding="utf-8") as tf:
tf.extractall(pathvar2)
# 2.把要追加的内容放进去
shutil.copy("/bin/echo" , pathvar2)
# 3.过滤文件重新压缩
# 查看文件夹当中有什么文件
lst = os.listdir(pathvar2)
print(lst) # ['chown', 'cp', 'echo', 'tmp']
with tarfile.open(pathvar1,"w:bz2",encoding="utf-8") as tf:
for i in lst:
if i != "chown":
# 拼凑成完整的绝对路径
abs_path = os.path.join(pathvar2,i)
# 剩下的都要压缩
"""add(路径,别名)"""
tf.add(abs_path,i)
"""
/mnt/hgfs/python32_gx/day16/ceshi0930_2/chown
/mnt/hgfs/python32_gx/day16/ceshi0930_2/cp
/mnt/hgfs/python32_gx/day16/ceshi0930_2/echo
tf.add("/bin/chown","chown")
"""
小提示:
在压缩文件的时候,路劲写全路径的话前面要加r,repr,让n特殊符号失效 想要输出% 输入%%-->% system()不能自动转换字符集,在linux中显示正常,在windows会乱码 popen()可以自动转换字符集 os.path.sdfsd os相当于文件夹,文件夹里有个path的模块(文件),文件里有一堆函数5. 小练习
os_path小练习: 计算一个文件夹中的所有文件大小
# ### 1.注册登录小程序
# 注册:
(1)检测两次密码如果相同,确认注册成功
(2)检测两次密码如果不同,提示两次密码不一致
(3)用户名不能重复
# 登录:
(1)输入账号密码:如果都正确,登录成功
(2)如果用户登录时进行三次校验,都不对,记录黑名单文件中
(3)如果是黑名单的用户,禁止下次再次登录
# ### 2.购物车小程序
# 1. 用户先给自己的账户充钱:比如先充3000元。
# 2. 页面显示 序号 + 名称 + 价格 , 如:
# [===========有如下商品供您选择:===========]
# 序号 名称 价格
# 1 电脑 1999
# 2 鼠标 10
# 3 游艇 20
# 4 美女 998
# n或N 购物车结算
# q或Q 退出程序(如不结算购物车可直接退出)]
# [==========================================]
# 购物车结算
# 3. 用户输入选择的商品序号,然后打印商品名称及商品价格,并将此商品,添加到购物车,用户还可继续添加商品。
# 4. 如果用户输入的商品序号有误,则提示输入有误,并重新输入。
# 5. (1)用户输入n为购物车结算,依次显示用户购物车里面的商品,数量及单价
# (2)若充值的钱数不足则让用户删除某商品,直至可以购买,若充值的钱数充足,则可以直接购买退出
# (3)退出程序之后,依次显示用户购买的商品,数量,单价,以及此次共消费多少钱,账户余额多少
# 6. 用户输入Q或者q 直接退出程序。
shopping_data.json文件
{"name":"电脑","price":1999}
{"name":"鼠标","price":10}
{"name":"游艇","price":20}
{"name":"美女","price":998}
{"name":"风油精","price":30}



