暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用Python os 模块的正确姿势

BPShare 2021-06-17
660

大家好!我是Uncle Ben,微信号:jiaszwx

今天跟大家聊一下Python自带的os模块常见用法。欢迎大家留言讨论!


os这个模块是Python自带的一个模块,也算是比较常用的模块之一了。那这个模块到底能干啥呢?今天我们就来一起研究一下。


从名字来看,os = operation system,那肯定是跟操作系统相关的了。


那第一个问题来了:可以直接使用么?答案是肯定的,但是需要提前导入一下这个模块就可以了。

举例


导入模块
import os


那么用Python怎么知道当前操作系统是什么操作系统(Windows,Linux)呢?

获取操作系统名称
import os

print(os.name)

# 运行结果:
nt

Process finished with exit code 0

【注意】

返回结果的意义

  • nt =  Windows

  • posix = Linux or Mac

另外还有一个模块叫platform,想了解的同学可以自行搜索一下和os模块的区别。


获取环境变量

敲黑板,重要的知识点!!!

import os

my_env = os.environ
print(my_env)
print(my_env.get('HOME'))


# 运行结果:
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\username\\AppData\\Roaming',...
'OS': 'Windows_NT', 'PATH': 'C:\\Users\\username\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages\\pywin32_system32;C:\\Program Files (x86)\\Microsoft SDKs\\Azure\\CLI2\\wbin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;', 'HOME': 'C:\\Users\\username', 'USERDNSDOMAIN': 'ABC.COM', 'USERDOMAIN': 'ABC', 'USERDOMAIN_ROAMINGPROFILE': 'ABC', 'USERNAME': 'username', 'USERPROFILE': 'C:\\Users\\username', ...})
       
C:\Users\username

【说明】

比如在Windows上,你要把文件保存到当前用户的Documents文件夹下,其实完整的目录路径是:C:\Users\username\Documents

其中的username是变化的,不同的用户登录系统,都有自己的Documents文件夹。所以这个时候就要用到环境变量里的内容了,而且关于各种各样的环境变量信息你都可以在os.environ里找到。


运行系统命令
#例一
import os

print(os.system("python --version"))


# 运行结果:
Python 3.7.9
0

#################################################
#例二
import os

print(os.system("powershell get-process"))


# 运行结果:
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                                                  
-------  ------    -----      -----     ------     --  -- -----------                                                  
   207      14     3256       9968       0.84  12256   1 AeXAgentUIHost                                              
   831      53    53180       7876             11568   0 AeXNSAgent                                                  
   510      28    26068      20288       1.66  16740   1 ApplicationFrameHost                                        
   159       9     2460       4704              5740   0 armsvc                                                      
   522      27     6624      15080      22.59   6024   1 AuthManSvr          
  ...     ..     ....       ...       ...     ...   . ...
   
0

【注意】

上面运行结果中最后一行输出的是0,这个就是代表命令执行成功。如果返回结果是非0,那就代表命令执行没有成功。


获取当前工作目录

os.getcwd()

import os

print(os.getcwd())


# 运行结果:
C:\lab\pythonlab\BigDataBasic\Big_Data_Basic_Session3

【说明】

  • 当前执行.py文件的当前路径


获取指定目录下的文件或文件夹
import os

my_path = r"C:\lab\pythonlab"

print(os.listdir(my_path))

# 运行结果:
['.idea', '05_btc_data_analytics_training', 'bbbbtest.txt', 'BigDataBasic', 'demo.md', 'departmentnamelist.txt', 'digital-talents', 'femal.png', 'file_demo.py', 'FOA_Archi_V0.9.pdf', 'incubator-echarts-4.9.0-rc.1', 'Intel', 'man.png', 'orderform', 'pwd.txt', 'Python Basic Best Practice Share.md', 'Python Basic Session02.md', 'Python Basic Session02_input_while_function.pdf', 'sff_basic_homework', 'Template - Copy.xlsx', 'Template.xlsx', 'Template_FOA_final_20200228.xlsx', 'write_file_demo.txt', 'zen_of_python_cn.txt', 'zen_of_python_en.txt']

Process finished with exit code 0

【说明】不包括子目录下的文件和文件夹


更改工作目录

os.chdir("target_path")

import os

print(os.getcwd())
print(os.chdir(r"c:\temp"))
print(os.getcwd())

# 运行结果:

C:\lab\pythonlab\BigDataBasic\Big_Data_Basic_Session3
None
c:\temp

如果目标路径不存在会是怎么样呢?你会得到一个FileNotFoundError,见下:

import os

os.chdir(r"c:\temp\abc")

# 运行结果:
Traceback (most recent call last):
 File "C:/lab/pythonlab/BigDataBasic/Big_Data_Basic_Session3/pkg_module_demo.py", line 5, in <module>
   os.chdir(r"c:\temp\abc")
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'c:\\temp\\abc'

Process finished with exit code 1


目录路径与文件名拼接
import os

my_dir = r"C:\lab\pythonlab"
my_file = "zen_of_python_en.txt"
print(os.path.join(my_dir, my_file))

# 运行结果:
C:\lab\pythonlab\zen_of_python_en.txt

Process finished with exit code 0


判断给定路径是否为目录
import os

path1 = r"C:\lab\pythonlab\BigDataBasic"
path2 = r"C:\lab\pythonlab\BigDataBasic\Big_Data_Basic_Session3\pkg_module_demo.py"
print(os.path.isdir(path1))
print(os.path.isdir(path2))

# 运行结果:
True
False

Process finished with exit code 0


获取文件路径中的目录名
import os

file_path = r"C:\lab\pythonlab\demo.md"

print(os.path.dirname(file_path))


# 运行结果:
C:\lab\pythonlab

Process finished with exit code 0



判断给定路径是否为文件
import os

path1 = r"C:\lab\pythonlab\BigDataBasic"
path2 = r"C:\lab\pythonlab\BigDataBasic\Big_Data_Basic_Session3\pkg_module_demo.py"
print(os.path.isfile(path1))
print(os.path.isfile(path2))

# 运行结果:
False
True

Process finished with exit code 0


判断文件或者目录是否存在
import os

path1 = r"C:\lab\pythonlab\BigDataBasic"
path2 = r"C:\lab\pythonlab\BigDataBasic\Big_Data_Basic_Session3\pkg_module_demo.py"
path3 = r"C:\lab\nofolder"
path4 = r"C:\lab\nofolder\nofile.txt"

print(os.path.exists(path1))
print(os.path.exists(path2))
print(os.path.exists(path3))
print(os.path.exists(path4))

# 运行结果:
True
True
False
False

Process finished with exit code 0


获取目录路径中的文件名

方法1:

import os

file_path = r"C:\lab\pythonlab\Python Basic Session02_input_while_function.pdf"
print(os.path.basename(file_path))

# 运行结果:
Python Basic Session02_input_while_function.pdf

Process finished with exit code 0


方法2:

import os

path1 = r"C:\lab\pythonlab\BigDataBasic"
path2 = r"C:\lab\pythonlab\BigDataBasic\Big_Data_Basic_Session3\pkg_module_demo.py"

print(os.path.split(path1))
print(os.path.split(path2))
print(os.path.split(path2)[-1])

# 运行结果:
('C:\\lab\\pythonlab', 'BigDataBasic')
('C:\\lab\\pythonlab\\BigDataBasic\\Big_Data_Basic_Session3', 'pkg_module_demo.py')
pkg_module_demo.py

Process finished with exit code 0


获取文件扩展名
import os

file_path = r"C:\lab\pythonlab\demo.md"

print(os.path.splitext(file_path))
print(os.path.splitext(file_path)[-1])


# 运行结果:
('C:\\lab\\pythonlab\\demo', '.md')
.md

Process finished with exit code 0


列出指定目录下所有文件的文件名
import os

my_path = r"C:\lab\pythonlab\BigDataBasic\Big_Data_Basic_Session3"
print(os.listdir(my_path))
print(os.walk(my_path))
for file in os.walk(my_path):
   print(file)
   
   
# 运行结果:
['mypackage', 'pkg_module_demo.py']
<generator object walk at 0x000002137F20BD48>
('C:\\lab\\pythonlab\\BigDataBasic\\Big_Data_Basic_Session3', ['mypackage'], ['pkg_module_demo.py'])
('C:\\lab\\pythonlab\\BigDataBasic\\Big_Data_Basic_Session3\\mypackage', [], ['__init__.py'])

【说明】

包括子文件夹中的文件名


删除文件
import os

file_path = r"C:\lab\pythonlab\testfile.txt"
print(os.remove(file_path))

os.remove(r"C:\temp\test")

# 运行结果:
None

PermissionError: [WinError 5] Access is denied: 'C:\\temp\\test'

Process finished with exit code 1

【说明】

如果给定的路径是一个文件夹路径,Python会抛出:PermissionError: [WinError 5] Access is denied: 'C:\temp\test',即使test文件夹为空文件夹。


删除文件夹
import os

os.rmdir(r"C:\temp\test")

# 运行结果:
Process finished with exit code 0

说明:os.rmdir(path)这个方法中,文件夹必须为空,否则会抛出异常:OSError: [WinError 145] The directory is not empty: 'C:\temp'

Traceback (most recent call last):
 File "C:/lab/pythonlab/BigDataBasic/Big_Data_Basic_Session3/pkg_module_demo.py", line 95, in <module>
   os.rmdir(r"C:\temp")
   OSError: [WinError 145] The directory is not empty: 'C:\\temp'

Process finished with exit code 1


重命名文件或文件夹名

文件重命名


import os

# 方法1
# file_name = "name1.txt"
# new_name = "name2.txt"
# base_dir = r"C:\temp\test"
# os.rename(os.path.join(base_dir, file_name), os.path.join(base_dir, new_name))

file_path = r"C:\lab\pythonlab\testfile.txt"
base_dir = os.path.dirname(file_path)
os.chdir(base_dir)
os.rename("testfile.txt", "rename.txt")


# 运行结果:
Process finished with exit code 0

文件夹重命名

import os

file_path = r"C:\temp\testfolder"
base_dir = os.path.dirname(file_path)
os.rename(base_dir, r"C:\temp\newtestfolder")

# 运行结果:
Process finished with exit code 0


练练手

练习题 1
  • 判断当前系统并输出系统名称:Linux或Windows

  • 获取当前用户名以及域名信息并输出

    • 输出格式:域名\用户名


练习题 2
  • 重命名一个文件夹

  • 重命名一个文件


练习题 3

模拟用户保存文件到指定目录:

  • 文件名:os_homework.txt

  • 文件内容:用户可以自定义,随便输入内容

  • 如果该文件已存在,提示用户:该文件已存在

  • 如果目录不存在,帮助用户自动创建目录

【提示】:需要用with open()

觉得还不错?点个👍呗!

文章转载自BPShare,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论