python:os模块

一、os介绍

os模块主要是对操作执行执行操作,导入方法:import os

二、os.path模块的基本操作

1. 绝对路径
  • os.path.abspath(path)
    返回path的绝对路径
# 获取当前工作环境的绝对路径,不包括文件名
cur_path = os.path.abspath('.')
print(cur_path)         # 结果 F:\PythonWorkSpace\PythonStudy\moduleStudy
# 获取当前工作环境的绝对路径,包括文件名
cur_file_path = os.path.abspath(__file__)
print(cur_file_path)      # 结果:F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py
# 获取当前工作环境上一级的绝对路径
pre_path = os.path.abspath("..")
print(pre_path)         # 结果 F:\PythonWorkSpace\PythonStudy
# 获取绝对路径的绝对路径
path = r'C:\Users\admin'
result = os.path.abspath(path)
print(result)         # 结果 C:\Users\admin
# 获取相对路径的绝对路径
path = './test'
result = os.path.abspath(path)
print(result)       # 结果F:\PythonWorkSpace\PythonStudy\moduleStudy\test
2. 获取路径的文件名、文件的路径
  • os.path.basename(path)
    返回路径的文件名
  • os.path.dirname(path)
    返回文件的路径
path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy'
file_name = os.path.basename(path)
print(file_name)       # 结果 moduleStudy
file_path = os.path.dirname(path)
print(file_path)       # 结果 F:\PythonWorkSpace\PythonStudy
path = r"F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py"
file_name = os.path.basename(path)
print(file_name)       # 结果 os_operate.py
file_path = os.path.dirname(path)
print(file_path)       # 结果 F:\PythonWorkSpace\PythonStudy\moduleStudy
3.判断路径是否存在
  • os.path.exists(path)
    若path存在返回True
    若path不存在返回False
path = r'F:\PythonWorkSpace\PythonStudy'
isExist = os.path.exists(path)
print(isExist)       # 结果 True
path = r'F:\PythonWorkSpace\PythonStudy11'
isExist = os.path.exists(path)
print(isExist)       # 结果 False
4.转化path中的"~" 和 "~user"为用户目录
  • os.path.expanduser(path)
    返回路径
path = "~"
result = os.path.expanduser(path)
print(result)       # 结果 C:\Users\admin
5. 判断路径是否为文件、文件夹
  • os.path.isfile(path)
    若是文件,返回True;若不是文件,返回False
  • os.path.isdir(path)
    若是文件夹,返回True;若不是文件夹,返回False
path = r"F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py"
isfile = os.path.isfile(path)
print(isfile)       # 结果 True
isdir = os.path.isdir(path)
print(isdir)       # 结果 False
path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy'
isfile = os.path.isfile(path)
print(isfile)       # 结果 False
isdir = os.path.isdir(path)
print(isdir)       # 结果 True
6.获取文件的时间
  • os.path.getmtime(file)
    返回文件的修改时间
  • os.path.getctime(file)
    返回文件的创建时间
file = r"F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py"
amend_time = os.path.getmtime(path)
print(amend_time)       # 结果 1547634893.3910005
create_time = os.path.getctime(file)
print(create_time)       # 结果 1547623358.1830003
7.获取文件的大小
  • os.path.getsize(file)
    若file存在,则返回文件的大小,单位为字节;
    若file不存在,报错FileNotFoundError
result = os.path.getsize(file)
print(result)       # 结果 2921
8.合并目录与文件名为路径
  • os.path.join(path [, name1, name2...])
    在path后追加name1、name2...,组成新路径
path = r"F:\PythonWorkSpace"
file1 = 'PythonStudy'
file_path = os.path.join(path, file1)
print(file_path)        # 结果 F:\PythonWorkSpace\PythonStudy
file2 = 'moduleStudy'
file_path = os.path.join(path, file1, file2)
print(file_path)        # 结果 F:\PythonWorkSpace\PythonStudy\moduleStudy
9.分割路径
  • os.path.split(path)
    将路径分割成dirname和basename,返回元组类型
  • os.path.splitext(path)
    将路径分割成“文件后缀”和“文件路径+文件名”,返回元组类型
path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy'
result = os.path.split(path)
print(result)           # 结果 ('F:\\PythonWorkSpace\\PythonStudy', 'moduleStudy')
result = os.path.splitext(path)
print(result)       # 结果 ('F:\\PythonWorkSpace\\PythonStudy\\moduleStudy', '')

path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py'
result = os.path.split(path)
print(result)           # 结果 ('F:\\PythonWorkSpace\\PythonStudy\\moduleStudy', 'os_operate.py')
result = os.path.splitext(path)
print(result)       # 结果 ('F:\\PythonWorkSpace\\PythonStudy\\moduleStudy\\os_operate', '.py')
path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy'

三、os模块的基本操作

1. 获取当前工作目录
  • os.getcwd()
    返回当前工作路径
cur_path = os.getcwd()
print(cur_path)     # 结果 F:\PythonWorkSpace\PythonStudy\moduleStudy
2.获取指定路径下的所有文件名
  • os.listdir(path)
    以列表形式返回path路径下的所有文件或文件夹的名称
file_names = os.listdir(cur_path)
print(file_names)       # 结果 ['configparser_operate.py', 'os_operate.py', 'test', '__init__.py']

Eg:获取某个路径下的最新文件

# 获取path路径下的最新文件
def get_new_file(path):
    dir_list = os.listdir(path)
    dir_list.sort(key=lambda fn: os.path.getmtime(path + '\\' + fn))
    new_file = os.path.join(path, dir_list[-1])
    return new_file
print(get_new_file(path=cur_path))
3. 创建一个文件夹和多层文件夹
  • os.mkdir(path[, mode])
    path:创建一个名为path的目录
    mode:非必填项,目录的权限,默认为0o777
    若目录不存在,则新建目录;若目录存在,则报错
  • os.makedirs(path[, mode])
    path:递归创建目录(多层级文件夹一次创建)
    若目录不存在,则新建目录;若目录存在,则报错
folder_path = r'D:/test'
if not os.path.exists(folder_path):
    os.mkdir(folder_path)
folder_path = r'D:/first/second'
if not os.path.exists(folder_path):
    os.makedirs(folder_path)
4.删除空目录和多层空目录
  • os.rmdir(path)
    若path目录为空目录,则删除此目录
    若path目录不为空,则报错
  • os.removedirs(path)
    若path目录为空目录,则删除此目录
    若path目录不为空,则报错
# 删除空文件夹
folder_path = r'D:/test'
if not os.listdir(folder_path):
    os.rmdir(folder_path)
# 递归删除空文件夹
folder_path = r'D:/first/second'
if not os.listdir(folder_path):
    os.removedirs(folder_path)
5.删除一个文件
  • os.remove(path)
    若path为文件且存在,则执行删除操作;
    若path为目录,则报错
file_path = r'D:/test/1.txt'
if os.path.exists(file_path):
    if os.path.isfile(file_path):
        os.remove(file_path)
6.重命名文件或文件夹
  • os.rename(src, dst)
    将目标文件或文件夹src重命名dst
  • os.renames(old, new)
    递归重命名文件或文件夹old为new
src = r'D:/test'
dst = r'D:/tests'
if os.path.exists(src):
    os.rename(src, dst)
src = r'D:/tests/2.txt'
dst = r'D:/tests/555.txt'
if os.path.exists(src):
    os.rename(src, dst)
# 递归重命名文件
old = r'D:/tests/3.txt'
new = r'D:/tests/a/1.txt'
if os.path.exists(old):
    os.renames(old, new)
old = r'D:/tests/a'
new = r'D:/tests/b'
if os.path.exists(old):
    os.renames(old, new)
7. 获取系统环境变量
  • os.environ
# 获取系统所有环境变量
environment = os.environ
print(environment)              # 结果 environ({'ANDROID': XXX, 'ANDROID_HOME': XXX, 'PATH': XXX, ....})
# 获取"ANDROID"的环境变量信息
print(environment['ANDROID'])   # 结果 C:\Users\admin\AppData\Local\Android\Sdk\platform-tools

Eg:设置系统环境变量

# 设置系统环境变量
path_result = os.environ['PATH']
add_path = 'D:\\first'
if path_result[-1] == ';':
    os.environ['PATH'] += add_path
else:
    os.environ['PATH'] += ";" + add_path
8. 打开PC端某个文件或文件夹
  • os.startfile(path)
path = r"C:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"
os.startfile(path)
path = r"C:\Program Files (x86)\Tencent\QQ\Bin"
os.startfile(path)
9.遍历目录
  • walk(top, topdown=True, onerror=None, followlinks=False)
  • top:遍历的顶级目录的路径
    top目录下返回一个三元组(dirpath, dirnames, filenames)
    dirpath:字符串类型,当前正在遍历的文件夹的地址;
    dirnames:列表类型,dirpath目录下所有目录的名称(不包括子目录);
    filenames:列表类型,dirpath目录下所有的文件(不包括子目录);
  • topdown:默认为True
    topdown为True表示先遍历top目录,再遍历top的子目录;
    topdown为False表示先遍历top的子目录,再遍历top目录;
  • onerror:默认为None
    onerror为None表示忽略文件遍历时的错误;
    onerror不为None则提供一个自定义函数提示错误信息后继续遍历或抛出异常中止遍历;
  • followlinks:默认为False
    followlinks为False表示优先遍历top的子目录;
    followlinks为True表示遍历目录下的快捷方式
def walk_operate(path):
    for dirpath, dirnames, filenames in os.walk(path):
        print(dirpath, dirnames, filenames)
top_path = 'D:\\tests'
walk_operate(top_path)
"""结果
D:\tests ['1', '2'] []
D:\tests\1 [] ['1.txt', '2.txt']
D:\tests\2 ['2.1'] ['1.txt']
D:\tests\2\2.1 [] []
"""
#表示tests目录下有两个文件夹1和2
# 子目录1下有两个文件1.txt和2.txt,无文件夹
# 子目录2下有一个文件夹2.1,一个文件1.txt
# 子目录2下的子目录2.1下无文件夹和文件
10. 执行系统命令os.system
  • os.system(command)
    在当前进程中打开一个子进程来执行系统shell命令command;
    仅会输出命令执行状态码,而将命令执行结果输出到屏幕上,故执行无法获取command命令执行后的输出内容。
    若执行成功则返回状态码0;若执行失败则返回状态码1;
11.执行系统命令os.popen
  • os.popen(command[, mode, bufsize])
    打开一个管道,返回结果是一个连接管道的文件对象;
    通过对文件对象来获取command命令执行后的输出内容,但无法获取命令执行状态码。

command:系统shell命令;
mode:非必写项,模式权限('r'和'w'),默认为'r';
bufsize:非必写项,表示文件需要的缓冲大小,0表示无缓冲,1表示行缓冲,-1表示使用系统默认值(默认为-1);

# 执行系统命令
cmd = "adb devices"
run_result = os.system(cmd)
print("sys_result:", run_result)

run_result = os.popen(cmd)
popen_result = run_result.readlines()
print("popen_result:", popen_result)
run_result.close()

run_result = os.popen(cmd)
popen_result = run_result.read()
print("popen_result:\n", popen_result)
run_result.close()

'''结果
sys_result: 0
popen_result: ['List of devices attached \n', '106D111805005938\tdevice\n', '\n']
popen_result:
 List of devices attached 
106D111805005938    device


'''

Eg1:获取所有连接PC的手机device_name

def get_devices():
    """
    获取所连devices信息
    :return: 若device存在,则以列表形式返回;若device不存在,则返回None
    """
    cmd = "adb devices"
    f = os.popen(cmd)
    result = f.readlines()
    f.close()
    devices = []
    for temp in result:
        if '\tdevice' in temp:
            device_name = temp.split('\tdevice')[0]
            devices.append(device_name)
    if len(devices) > 0:
        return devices
    else:
        return None
get_devices()

Eg2:执行系统多条命令:命令之间通过&&关联

# 执行多条命令
# 由于仅是执行系统命令,无需返回结果,故os.system()或os.popen()方式均可
cmd1 = "E:"
cmd2 = "cd demo"
cmd3 = "mkdir test"
cmd = "%s && %s && %s" % (cmd1, cmd2, cmd3)
os.system(cmd)
# os.popen(cmd)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容