一、os模块简介

os:operate system --->操作系统的缩写!

os模块代表了程序所在的操作系统,主要用于获取程序运行所在操作系统的相关信息

二、常用的属性和方法

(1)操作系统相关的

import os

# (1)当前操作系统的类型-->属性
# 作用:返回导入依赖模块的操作系统的名称
# 当前只注册了3个值:分别是posix(Linux/Unix/Mac) , nt(Windows) , java(JVM)
print(os.name)
# 对比Linux的(uname -a -->完整的系统版本 ;uname -r -->内核版本)

# (2)操作系统详细的信息-->返回的是一个对象
info = os.uname()
# print(type(info))
# 系统的版本类型-->linux
print(info.sysname)
# 主机的名字-->有用!
print(info.nodename)

# (3)系统的环境变量-->对返回当前系统上所有环境变量组成的字典(type发现不是,但是可以通过键找值的方式)
print(os.environ)
# print(type(os.environ))
# (4)通过键获取环境变量对应的value值-->两种方式!
print(os.environ['PATH'])
print(os.environ.get('PATH'))

# (5)返回操作系统的换行符
# Windows(\r\n);Linux(\n);Mac OS X(\r)
print(os.linesep)

# (6)返回当前系统多条路径的分割符
# Windows(;分号);Linux/Unix/Mac(:冒号)
print(os.pathsep)
# (7)返回路径分割符号-->"/"
print(os.sep)
# (8)启动一个shell命令(运行操作系统上指定的命令)
os.system(command) #字符串的形式!

(2)进程相关

getpid()      #获取当前进程的ID

kill(pid,sig) #将sig信号发送到pid对应的进程,可用于结束进程!

os.urandom(n)函数;python的os.urandom 的用途

(3)操作文件和目录

       3.1)os.path模块

功能:获取

import os

# (1)获取文件的绝对(abs)路径(path),没有就创建(默认当前路径)
file_path = os.path.abspath('os1.py')
print(file_path)
# 等价方式
file_path1 = os.path.join(os.path.abspath('.'), 'os1.py')
# 需求:自定义文件的"绝对路径字符串"
print(os.path.join('/home/kiosk', 'os1.py'))
# 需求:获取当前文件路径,用'.'!
print(os.path.abspath('.'))

# (2)获取文件所在的目录-->shell中也有此命令
print(os.path.dirname(file_path))

# (3)获取文件的名字
print(os.path.basename(file_path))

# (4)获取文件的路径和文件名-->特点:分离文件名和目录,放到一个元组中(与上面等效)
print(os.path.split(file_path))

# (5)分离文件名和后缀名-->默认以"."作为分割符-->放到一个元组中
print(os.path.splitext('hello.java'))

  备注:获取文件的大小、获取时间(三种)等,有需求的时候可以查帮准文档!

  功能:判断

# (1)"判断"是否是绝对路径
# 底层:通过是否以/开头,不会判断路径是否存在
print(os.path.isabs('os1.py'))  # False
print(os.path.isabs(file_path))  # True

# (2)判断是否为目录|文件|同一个文件(硬链接)

说明:这章节与文件的打开紧密相关,只有确定文件的字符串路径才能对文件进行相关操作!

    3.2)os模块操作文件和目录的函数

功能:目录的创建和删除|文件的创建和删除|重命名|

# (1)创建目录
# linux shell命令-->mkdir mkdir -p
os.mkdir('img')
# 需求:递归的创建
os.makedirs('img/file1/file2')

# (2)删除目录
# 特点:不能传归有内容的目录
os.rmdir('img')
# 特点:递归的删除目录的内容
os.remocedirs('img')

# (3)创建文件和删除文件(默认当前路径下)
os.mknod('00_ok.txt')
os.remove('00_ok.txt')

# (4)文件重命名
os.rename('data.txt','data1.txt')
# (5)文件或目录的重命名
os.renames(path,dir)

后续:与权限相关的函数,与文件访问相关的函数

三、应用场景的演示

需求1:

"""

1. 在当前目录新建目录img, 里面包含多个文件, 文件名各不相同(X4G5.png)-->假如100个!
2. 将当前img目录所有以.png结尾的后缀名改为.jpg

"""

# 分析1:根据文件名的特点,所以第一步需要生成符合文件标识的字符,随机选取然后拼接,进而创建文件
# 细节:如何保证文件名字不同?
import os
import random
import string

# (1)定义一个函数产生文件名字符串,然后拼接构成绝对路径,进而创建文件!

# 1)产生全局的字符串-->性能问题
total_char = string.ascii_letters + string.digits


# print(total_char,type(total_char))
# 2)定义函数-->产生合法的字符串(就像验证码一样)
def cre_code():
    # sample-->从序列中选取的是n个"独立的"的元素()
    list1 = random.sample(total_char, 4)
    print(list1)
    # 列表串成一个字符串
    return ''.join(list1)


# print(cre_code())

# 2)批量产生合法的文件名字
# 需求:如何保证文件的名字唯一
def cre_file():
    # 随机生成若干个字符串(类似验证码)
    # 产生一个集合保存文件-->集合自动去重!
    file_list = set()
    os.mkdir('img')
    # 产生若干个没有重复的名字-->文件少,重名的概率低!
    while len(file_list) != 100:
        file_list.add(cre_code())
    # 批量创建文件
    for name in file_list:
        # 说明:最开始的时候想着通过字符串;创建文件的返回数值保证文件名不会相同(没有返回值)
        os.mknod('img/' + name + '.png')

# cre_file()

# 功能2:批量的重命名
def modify_suffix(path, old_suffix, new_suffix):
    """
    :param path: 操作的目录
    :param old_suffix: 文件原来的前缀
    :param new_suffix: 文件改成的后缀
    :return: 没有返回数值

    """
    # 保证功能的健壮性
    # (1)判断是否存在此路径
    if os.path.isdir(path):
        # (2)查找符合要求的文件-->目录的文件
        files_list = [file for file in os.listdir(path) if file.endswith(old_suffix)]
        # (3)将后缀名和文件名分开,流下文件名
        basenames = [os.path.splitext(filename)[0] for filename in files_list]
        print(basenames)
        # (4)重命名
        for filename in basenames:
            oldname = os.path.join(path, filename + old_suffix)
            newname = os.path.join(path, filename + new_suffix)
            os.rename(oldname, newname)
            print('%s命名为%s成功' % (oldname, newname))
    else:
        print('%s不存在,不能操作...' % (path))


modify_suffix('img', '.png', '.jpg')

说明:如果文件比较少,可以不用考虑

def create_file():
    # 可能实际文件的个数不是100个,集合生成式会去重!
    li = {gen_code() for i in range(100)}
    os.mkdir('img')
    for name in li:
        os.mknod('img/' + name + '.png')
# create_file()