# 学会使用 Help dir

import os

# dir
print(dir(os)) # 返回模块中所有的函数

# help
print(help(os.getcwd))  #  获取函数使用帮助

# os.path
print(dir(os.path))   # 返回模块中所有的函数

 

# pathlib

# 获取当前目录 .
# 获取上一级目录 ../
# path.iterdir() -- 遍历当前目录下的所有文件和子目录
# path.glob("*.txt") -- 获取当前目录及其所有子目录下的指定文件 -- 例如 *.txt

 

# pathlib

import pathlib
#pathlib.Path(".") -- 获取当前目录
current_path = pathlib.Path(".")
print(current_path)

# pathlib.Path("../") -- 取上一级目录
up_path = pathlib.Path("../")
print(up_path)

# 遍历当前目录下的所有文件和子目录
iterdir = current_path.iterdir()
print(type(iterdir))
for i in iterdir:
print(i)

print("-------------------")
# 获取文件夹下的指定文件
glob_file = current_path.glob("*.txt")
for j in glob_file:
print(j)

# os.path 常用函数

# os.path.exists(path) -- 判断 path 对应的文件是否存在,如果存在,返回 True;反之,返回 False

# os.path.abspath(path) -- 返回 path 的绝对路径
# os.path.dirname(path) -- 返回 path 路径中的目录部分
# os.path.basename(path) -- 获取 path 路径的基本名称,即 path 末尾到最后一个斜杠的位置之间的字符串
# os.path.join(path1[, path2[, ...]]) -- 把目录和文件名合成一个路径
# os.path.split(path) -- 把路径分割成 dirname 和 basename,返回一个元组


# os.path.getatime(path) -- 返回 path 所指文件的最近访问时间(浮点型秒数)
# os.path.getmtime(path) -- 返回文件的最近修改时间(单位为秒)
# os.path.getctime(path) -- 返回文件的创建时间(单位为秒,自 1970 年 1 月 1 日起(又称 Unix 时间))
# os.path.getsize(path) -- 返回文件大小,如果文件不存在就返回错误

# os.path.isfile(path) -- 判断路径是否为文件
# os.path.isdir(path) -- 判断路径是否为目录
# os.path.islink(path) -- 判断路径是否为链接文件(类似 Windows 系统中的快捷方式)

# os.path 常用函数

filename = r"TED演讲.txt"

# path.exists(path) -- 判断 path 对应的文件是否存在,如果存在,返回 True;反之,返回 False
print(os.path.exists(filename))

# os.path.abspath(path) -- 返回 path 的绝对路径
print(os.path.abspath(filename))


# os.path.dirname(path) -- 返回 path 路径中的目录部分
print(os.path.dirname(filename)) # 由于是相对路径 ,所有输出为空
print("---------------")

file = os.path.abspath(filename)
print(os.path.dirname(file))
path1 = os.path.dirname(file)

# os.path.basename(path) -- 获取 path 路径的基本名称,即 path 末尾到最后一个斜杠的位置之间的字符串

print(os.path.basename(file))

path2 = os.path.basename(file)
print("---------------")

# os.path.join(path1[, path2[, ...]]) -- 把目录和文件名合成一个路径

print(os.path.join(path1,path2))

path3 = os.path.join(path1,path2)

print("---------------")

# os.path.split(path) -- 把路径分割成 dirname 和 basename,返回一个元组

dirname,basename = os.path.split(path3)
print(dirname)
print(basename)

# 获取文件相关的时间与大小属性
"""
os.path.getatime(path)
返回 path 所指文件的最近访问时间(浮点型秒数)
os.path.getmtime(path)
返回文件的最近修改时间(单位为秒)
os.path.getctime(path)
返回文件的创建时间(单位为秒,自 1970 年 1 月 1 日起(又称 Unix 时间))

os.path.getsize(path)
返回文件大小,如果文件不存在就返回错误。
"""

print(os.path.getctime(file)) # C -- creat
print(os.path.getmtime(file)) # M -- make
print(os.path.getatime(file)) # A -- access

print(os.path.getsize(file)) # Size

 

# 关于文件,文件夹,链接的判断
"""
os.path.isfile(path) -- 判断路径是否为文件
os.path.isdir(path) -- 判断路径是否为目录
os.path.islink(path) -- 判断路径是否为链接文件(类似 Windows 系统中的快捷方式)
"""

print(os.path.isfile(file)) # -- isfile

print(os.path.isdir(file)) # -- isdir

print(os.path.islink(file)) # -- islink

 

# 文件目录操作 os

# os.getcwd() -- 获取当前目录
# os.chdir() -- 改变当前目录
# os.listdir(path) # 获取当前

# os.mkdir(path [,mode]) -- 创建path对应的目录,其中mode用于指定该目录权限 -- 0o777 可读可写可执行
# os.mkdirs(path [,mode]) -- 创建path对应的目录,其中mode用于指定该目录权限;最大特点在于其可以递归的创建

# os.renames(old,new) -- 对文件或目录进行递归命名
# os.rename(src,dst) -- 重新命名文件或目录,将 src 重命名为 dst

# os.rmdir(path) -- 删除 path 对应的空目录,若目录非空,则抛出异常
# os.removedirs(path) -- 递归删除目录
# os.remove(path) -- 删除对应的文件

 

# 文件目录操作 -- 增

# os.getcwd() -- 获取当前目录
print(os.getcwd())
old_filepath = os.getcwd()

# os.chdir() -- 改变当前目录
change_file = r"C:\Users\duty1\Desktop\工作\研究方向\图像分割"
print(os.chdir(change_file)) # 改变当前工作目录
print(os.getcwd())

print("调整回原目录---------------")
print(os.chdir(old_filepath)) # 改变当前工作目录
print(os.getcwd())

# os.listdir(path) # 获取当前

print(os.listdir(old_filepath)) # 以列表模式返回当前目录下的所有目录和文件


# os.mkdir(path [,mode]) -- 创建path对应的目录,其中mode用于指定该目录权限 -- 0o777 可读可写可执行

new_path_1 = r"OS"
os.mkdir(new_path_1)
print("finesh---------------")

# os.mkdirs(path [,mode]) -- 创建path对应的目录,其中mode用于指定该目录权限;最大特点在于其可以递归的创建目录 adc/xyz/wawa
new_path_2 = r"ABC/xyz/wawa"
os.makedirs(new_path_2)
print("finesh---------------finish")

 

# 文件目录操作 -- 修改

# os.rename(src,dst) -- 重新命名文件或目录,将 src 重命名为 dst

path_src1 = r"OS"
path_dst1 = r"Clinton"
os.rename(path_src1,path_dst1)
print("-------------finish---------------")

# os.renames(old,new) -- 对文件或目录进行递归命名

path_src2 = r"ABC/xyz/wawa"
path_dst2 = r"Pluto"
os.rename(path_src2,path_dst2)
print("-------------end---------------")

 

# 文件目录操作 -- 删除

 

os.rmdir(path_dst1) # 删除 path 对应的空目录


del_file = r"my_file.txt" # 删除指定文件
os.remove(del_file)

os.removedirs(r"ABC/xyz") # 递归删除目录 目录需要为空

print("finish--------------------------")

 

# #!/usr/bin/env python
# -*- coding: utf-8 -*-

import subprocess
import os


# 方法一:os.system()
# 返回值:返回对应状态码,且状态码只会有0(成功)、1、2。
# 其它说明:os.system()的返回值并不是执行程序的返回结果。而是一个16位的数,它的高位才是返回码。也就是说os.system()执行返回256即 0×0100,返回码应该是其高位0×01即1。所以要获取它的状态码的话,需要通过>>8移位获取。
def adb_shell(cmd):
exit_code = os.system(cmd)
return exit_code>>8
# # os.system(cmd)命令会直接把结果输出,所以在不对状态码进行分析处理的情况下,一般直接调用即可
# os.system(cmd)


# # 方法二:os.popen()
# # 返回值:返回脚本命令输出的内容
# # 其它说明:os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被调用。而os.system不同,它只是调用,调用完后自身退出,执行成功直接返回个0。
# def adb_shell(cmd):
# result = os.popen(cmd).read()
# return result


# # 方法三:subprocess.Popen()
# # 返回值:Popen类的构造函数,返回结果为subprocess.Popen对象,脚本命令的执行结果可以通过stdout.read()获取。
# def adb_shell(cmd):
# # 执行cmd命令,如果成功,返回(0, 'xxx');如果失败,返回(1, 'xxx')
# res = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 使用管道
# result = res.stdout.read() # 获取输出结果
# res.wait() # 等待命令执行完成
# res.stdout.close() # 关闭标准输出
# return result


# # 方法四:subprocess.getstatusoutput()
# # 返回值:返回是一个元组,如果成功,返回(0, 'xxx');如果失败,返回(1, 'xxx')
# def adb_shell(cmd):
# result = subprocess.getstatusoutput(cmd)
# return result


cmd = 'adb shell dumpsys activity | grep "Run #"'
print(adb_shell(cmd))


四种方法中,需要根据不同需求来采用对应不同方法。
1.如果不需要对执行结果内容进行处理的,可以用方法一的os.system(),当然,也可以用其它三种方法。
2.由于方法一的os.system()会直接将执行结果输出来,不受我们控制。如果不想要把结果直接输出来,则只能采用后面三种方法。
3.subprocess.getstatusoutput()其实是对subprocess.Popen()的封装,两者的区别是subprocess.getstatusoutput()返回一个带有状态码status和结果output的元组,而subprocess.Popen()则直接返回结果output。