python中os和sys模块的使用

python内置库os和sys模块非常有用,在对系统或操作系统的操作方面都很有用,比如判断一个文件是否是目录,一个路径是否存在,获取系统的编码等等。

1.os包:os包下可以直接调用的函数

getcwd: 获取当前工作目录路径,无参,返回 字符串

listdir: 获取指定路径下所有的文件和文件夹,参数是path, 返回 列表

makedirs: 创建多级文件夹,如果没有给绝对路径,会创建到当前路径(相对路径),参数是path mode.

示例:

python 复制代码
def os_func():
    
    curr_path = os.getcwd()
    print('当前工作路径:', curr_path)
    
    new_path = '%s/test2' % curr_path
    if os.path.exists(new_path):
        print('file with the given path exists.')
    else:
        os.makedirs(new_path)
    
    data = os.listdir(curr_path)
    print(data)

    new_path2 = '%s/test2/abc' % curr_path  # 已存在的文件再新建文件,会报错
    os.makedirs(new_path2)

    # 没有给路径,只给了一个文件/文件夹,就直接在当前路径下新建文件
    os.makedirs('test3')  
输出:

FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'C:\\Users\\fang\\PycharmProjects\\pyProj\\basic2/test2/abc'

current path:  C:\Users\fang\PycharmProjects\pyProj\basic2
['basic_lx.py', 'dt1.txt', 'os_func2.py', 'os_funcs.py', 'tes.txt', 'test11', 'test2', 'time_lx.py', '__init__.py']

如上,如果已存在的文件路径,再创建文件,那么会报错'当文件已存在时,无法创建该文件。'

removedirs: 传参path, 删除给定路径的多级文件夹,

rename(oldname, newname): 重命名文件/文件夹,

rmdir: 只删除空文件夹,传参空目录,如果是非空,则无法删除

例子:

python 复制代码
def os_func2():
    
    if os.path.exists('test2'):
        os.removedirs('test2')
    
    os.rmdir('test3')
    os.rename('test11', 'test1')

输出:
 File "C:\Users\fang\PycharmProjects\pyProj\basic2\os_func2.py", line 37, in os_func2
    os.removedirs('test2')
  File "C:\Users\fang\AppData\Local\Programs\Python\Python310\lib\os.py", line 243, in removedirs
    rmdir(name)
OSError: [WinError 145] 目录不是空的。: 'test2'

如上,使用os.removedirs('test2')删除非空文件夹test2时,报错了,从报错信息得知,removedirs()方法最终调用的还是rmdir()方法,所以因为test2非空,所以无法删除。

当使用os.removedirs('test2/ab')时,因为最后一级ab是空文件夹,所以成功删除掉ab文件夹。

这里要注意的是,os.removedirs(), os.rmdir()都只能删除非空文件夹

另外注意:os.rename('test2/bk', 'test2/bk1') 这样对最低层级的文件重命名也是可以的。当newname和已有的文件重名时,会报错FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'test12' -> 'test1'。所以,使用这个方法时,要注意命名的非重复性。

举例:1). **对os.removedirs():**当传参带文件的路径时,会报错'NotADirecotryError: 目录名称无效', 即程序检测到传参最低层级不是一个目录。这时候是不会删除成功的。os.removedirs()只针对目录的删除,对文件的删除是不凑效的。从报错信息可以看到,它最终调用的还是rmdir(),这个说到底还是针对空目录进行删除。

python 复制代码
os.removedirs('test11/abc.py')

结果:

 File "C:\Users\fang\PycharmProjects\pyProj\basic2\os_func2.py", line 148, in os_func4
    os.removedirs('test11/abc.py')
  File "C:\Users\fang\AppData\Local\Programs\Python\Python310\lib\os.py", line 243, in removedirs
    rmdir(name)
NotADirectoryError: [WinError 267] 目录名称无效。: 'test11/abc.py'

2). 对于os.rmdir(): 传参是空目录,才会删除成功。如: os.rmdir('test1/bk') 会把bk目录删除,并不会像os.removedirs()级联删除,把test1也删除掉。这是两者的区别。

  1. os.path常用的函数

|------------|--------------|---------------|----------------------------------|--------|
| 函数 | 参数 | 描述 | 例子 | 返回值 |
| exists | path | 文件或路径是否存在 | os.path.exists('d:/test1') | bool类型 |
| isdir | path | 是否是目录 | os.path.isdir('d:/test1') | bool类型 |
| isfile | path | 是否是文件 | os.path.isfile('d:/test1/ab.py') | bool类型 |
| isabs | path | 是否是绝对路径 | os.path.isabs('test2') | bool类型 |
| join | path, path* | 路径字符串合并,用\拼接 | os.path.join('d://','test3') | 字符串 |
| split | path | 以最后一层路径为基准分割 | os.path.split('d://test1') | 元组 |

示例:

python 复制代码
def os_path_func():
    
    curr_path = os.getcwd()
    print(os.path.exists(curr_path))
    print(os.path.isabs(curr_path))

    print(os.path.isabs('test2'))
    
    print(os.path.isdir('test2'))
    print(os.path.isfile('test2'))

    new_path = '%s/test4' % curr_path
    if os.path.exists(new_path):
        os.removedirs(new_path)
    os.makedirs(new_path)
    
    new_path2 = os.path.join(curr_path, 'test', 'abc')
    print(new_path2)
    
    file = os.path.split(curr_path)[-1]
    data = os.path.split(curr_path)  # 返回2个元素组成的元组
    print(data)
    print(file)

输出:
True
False
True
False
C:\Users\fang\PycharmProjects\pyProj\basic2\test\abc
('C:\\Users\\fang\\PycharmProjects\\pyProj', 'basic2')
basic2
    

如上可知,test2文件夹是目录,不是文件,所以os.path.isfile('test2')返回False. 其中os.path.split()是以给定路径最后一级为基准去分割,结果是返回2个元素组成的元组。

注意:os.path.exists()可以传绝对路径,也可以传相对路径。

python 复制代码
if os.path.exists('test1'):
    os.rename('test1', 'test11')

输出:
结果把test1重命名为test11
  1. sys模块 :常用于操作当前的操作系统/环境

sys中常用的函数:

|--------------------|----------|-----------------|---------------------------------|-----|
| 函数 | 参数 | 描述 | 例子 | 返回值 |
| modules | 无 | python启动时加载的模块 | sys.modules | 字典 |
| path | 无 | 返回当前python的环境路径 | sys.path | 列表 |
| exit | arg,默认为0 | 退出程序 | sys.exit | 无 |
| getdefaultencoding | 无 | 获取系统编码 | sys.getdefaultencoding(): 必须加() | 字符串 |
| platform | 无 | 获取当前系统平台 | sys.platform | 字符串 |
| version | 无 | 获取python的版本 | sys.version | 字符串 |
| argv | *args | 从程序外部获取参数 | sys.argv | 列表 |

示例:

python 复制代码
def sys_func():
    
    m = sys.modules
    print('python启动时加载的模块', m)
    
    path = sys.path
    print('当前python的环境路径', path)
    
    code = sys.getdefaultencoding()
    print('当前系统的编码:', code)

    print('当前系统平台', sys.platform)
    print('当前python的版本', sys.version)

输出:

关于argv, 它可以从程序外部获取参数,我们让它从终端传入参数给程序。

举个例子:

python 复制代码
command = sys.argv(1)
if command == 'modules':
    modules = sys.modules
    print('python启动时加载的模块', modules)
elif command == 'path':
    path = sys.path
    print('当前python的环境路径', path)
elif command == 'getdefaultencoding':
    code = sys.getdefaultencoding()
    print('系统编码', code)
elif command == 'platform':
    print('当前系统平台', sys.platform)
elif command == 'version':
    print('当前python的版本', sys.version)
else:
    print('no command')

从程序外部获取参数,python os_func2.py path,程序执行返回当前python的环境路径。

可以看到,在终端执行python脚本时传入参数可以被argv接收

相关推荐
蓝莓味柯基几秒前
Python3:文件操作
python
投笔丶从戎4 分钟前
Kotlin Multiplatform--01:项目结构基础
android·开发语言·kotlin
xiaoh_735 分钟前
解决视频处理中的 HEVC 解码错误:Could not find ref with POC xxx【已解决】
python·ffmpeg·音视频
杜小暑1 小时前
动态内存管理
c语言·开发语言·动态内存管理
想不明白的过度思考者1 小时前
Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
java·开发语言
明月与玄武1 小时前
Python编程的真谛:超越语法,理解编程本质
python·编程语言
我真的不会C1 小时前
QT窗口相关控件及其属性
开发语言·qt
CodeCraft Studio1 小时前
Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中进行数据验
开发语言·python·excel
火柴盒zhang1 小时前
websheet之 编辑器
开发语言·前端·javascript·编辑器·spreadsheet·websheet
景天科技苑1 小时前
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
开发语言·后端·rust·match·enum·枚举与模式匹配·rust枚举与模式匹配