day19:os模块&shutil模块&tarfile模块
os模块:对系统进行操作(6+3)
system popen listdir getcwd chdir environ / name sep linesep
import os #### os模块方法 #### # 1.system 在python中执行系统命令 os.system("ifconfig") os.system("touch 1.txt") # 2.popen 执行系统命令返回对象 # 可以通过read方法读出字符串,防止字符串乱码,使用popen进行操作 obj = os.popen("ifconfig") res = obj.read() print(res) # 3.listdir 获取指定文件夹中的所有内容的名称列表 lst = os.listdir(".") # . 当前目录 lst = os.listdir("..") # . 上一级目录 lst = os.listdir("/home/libolun") print(lst) # 4.getcwd 获取当前文件所在的默认路径(单纯的路径) res = os.getcwd() print(res) # /mnt/hgfs/python31_gx/day19 # 路径+文件 print(__file__) # /mnt/hgfs/python31_gx/day19/1.py # 5.chdir 修改当前文件工作的默认路径 os.chdir("/home/libolun/mywork") os.system("mkdir ceshi100") # 6.environ 获取或修改环境变量 print(os.environ) # 获取所有环境变量 print(os.environ["path"]) os.environ["path"] += ":/home/libolun/mywork" # 修改环境变量 os.system("libolun") #### os模块属性 #### # 1.name 获取系统标识 # linux,mac->posix windows->nt print(os.name) # 2.sep 获取路径分割符号 # linux,mac-> / windows-> \ print(os.sep) # 3.linesep 获取系统的换行符号 # linux,max-> \n windows->\r\n或\n print(repr(os.linesep))
os模块:新建和删除(7)
mknod remove mkdir rmdir rename makedirs removedirs
#### os 负责新建和删除 #### # 1 os.mknod 创建文件 os.mknod("1.txt") # 2.os.remove 删除文件 os.remove("1.txt") # 3.os.mkdir 创建文件夹 os.mkdir("ceshi100") # 4.os.rmdir 删除文件夹 os.rmdir("ceshi100") # 5.os.rename 对文件/文件夹重命名 os.rename("111.txt","123.py") # 6.os.makedirs 递归创建文件夹 os.makedirs("a/b/c/d/e") # 7.os.removedirs 递归删除文件夹(空文件夹) os.removedirs("a/b/c/d/e")
shutil:负责复制和移动(6+2+1)
copyfileobj copyfile copymode copystat copy copy2 copytree rmtree remove
# 1.copyfileobj(fsrc,fdst,[,length=16*1024]) 单纯复制文件的内容 # 需要手动创建文件对象 fp1 = open("123.py",mode='r',encoding="utf-8") fp2 = open("lianxi111.php",mode="w",encoding="utf-8") shutil.copyfileobj(fp1,fp2) # 2.copyfile(src,dst) 单纯的仅复制文件内容 # 在底层调用了copyfileobj shutil.copyfile("1.php","2.js") # 3.copymode(src,dst) 单纯的复制权限,不包括文件内容 shutil.copymode("1.php","2.js") # 4.copystat(src,dst) 复制文件所有状态信息,不包括内容 # 状态信息:包括权限、组、用户、修改时间 shutil.copystat("1.py","2.php") # 5.copy(src,dst) 复制文件的权限和内容 shutil.copy("1.py","2.html") # 6.copy2(src,dst) 复制文件权限和内容,还有组,时间,用户等 shutil.copy2("1.py","2.html") # 7.copytree(src,dst) 复制文件夹里的所有内容(递归拷贝) shutil.copytree("lianxi001","lianxi002") # 8.rmtree(path) 删除当前文件夹以及文件夹中的所有内容(递归删除) shutil.rmtree("lianxi001") # 9.move(path1,path2) 移动文件或者文件夹 shutil.move("1.php","..") shutil.move("lianxi001","../lianxi007") # 移动并改名
os.path:路径模块(6+3+3+3)
basename dirname split join splitext getsize isdir isfile islink getctime getatime getmtime exists isabs abspath
# 1.basename 返回文件名部分 strvar = "/home/libolun/mywork/1.py" res = os.path.basename(strvar) print(res) # 1.py # 2.dirname 返回路径部分 res = os.path.dirname(strvar) print(res) # /home/libolun/mywork # 3.split 将路径拆分为单独的文件部分和路径部分,并组合成一个元组 tup = os.path.split(strvar) print(tup) # 4.join 将多个路径和文件组成新的路径 # 可以自动通过不同的系统加不同的斜杠 path1 = "ceshi1" path2 = "libolun" path3 = "2.py" # pathvar = path1 + os.sep + path2 + os.sep + path3 pathvar = os.path.join(path1,path2,path3) print(pathvar) # 5.splitext 将路径分割为后缀和其他部分 res = os.path.splitext(strvar) print(res) # ('/home/libolun/mywork/1','.py') # 6.getsize 获取文件的大小 res = os.path.getsize("1.py") # 文件夹不能计算 res = os.path.getsize("os") print(res) # 7.isdir 检测路径是否是一个文件夹 strvar = "/home/libolun/mywork/libolun" res = os.path.isdir(strvar) print(res) # 8.isfile 检测路径是否是一个文件 strvar = "/home/libolun/mywork/libolun" res = os.path.isfile(strvar) print(res) # 9.islink 检测路径是否是一个链接 strvar = "/home/libolun/mywork/libolun" res = os.path.islink(strvar) print(res) # 10.getctime [windows]文件的创建时间 [linux]权限的改动时间 # 返回的是时间戳 res = os.path.getctime("1.py") # 11.getmtime 获取文件最后一次修改时间 res = os.path.getmtime("1.py") # 12.getatime 获取文件最后一次访问时间 res = os.path.getatime("1.py") # 13.exists 检测指定的路径是否存在 strvar = "/home/libolun/mywork/libolun" res = os.path.exists(strvar) print(res) # 14.isabs 检测一个路径是否是绝对路径 pathvar = "." res = os.path.isabs(pathvar) print(res) # 15.abspath 将相对路径转化为绝对路径 pathnew = os.path.abspath(pathvar) print(pathnew) # 检测是否是绝对路径,如果不是,将其转化为绝对路径 if not os.path.abspath(pathvar): pathnew = os.path.abspath(pathvar) print(pathnew)
tarfile:压缩模块(4)
压缩 解压 追加 查看
# 1.创建tar包 '''最小的压缩包,后缀格式为bz2''' # 单纯的tar包 tf = tarfile.open("ceshi001.tar",'w',encoding="utf-8") tf.add("bin/echo","echo") tf.add("bin/ed","ed") tf.add("bin/fuser","/tmp/fuser") tf.close() tf = tarfile.open("ceshi002.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() tf = tarfile.open("ceshi003.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("ceshi003.tar.bz2",'r',encoding="utf-8") # 解压单个 tf.extract("echo","ceshi004") # 解压所有 tf.extractall("ceshi005") # 3.追加文件 # 支持with语法 # 只能为没有压缩过的tar包进行追加 with tarfile.open("ceshi001.tar",'a',encoding="utf-8") as tf: tf.add("/bin/cp","cp") # 4.查看压缩包中的文件 with tarfile.open("ceshi002.tar.gz",'a',encoding="utf-8") as tf: lst = tf.getnames() print(lst)
思考题:计算一个文件夹的大小
import os pathvar = "/mnt/hgfs/python31_gx/day19/ceshi100" # 递归计算文件夹的大小 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)
思考题:如何处理tarfile不能再已经压缩过的保重追加内容的问题
import os path = os.getcwd() # 找到要解压的包的路径 pathvar1 = os.path.join(path,"ceshi0729_3.tar.bz2") # 解压到哪里去 pathvar2 = os.path.join(path,"ceshi0729_3") # (1) 先对已经压缩过的包进行解压 with tarfile.open(pathvar1,"r",encoding="utf-8") as tf: tf.extractall(pathvar2) # (2) 往这个解压的文件夹中添加新的文件 mybin = "cp -a /bin/fgrep " + pathvar2 # print(mybin) # cp -a /bin/fgrep /mnt/hgfs/python31_gx/day19/ceshi0729_3 os.system(mybin) # (3) 对这个文件进行过滤筛选,重新打包压缩 (不要echo) lst = os.listdir(pathvar2) 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)