python标准库之系统

python标准库的os模块提供了一种方便的使用操作系统函数的方法,而sys模块则提供了对由解释器使用或维护的变量的访问和与解释器进行交互的函数。
简单来说,os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。

一、os常用方法

1、基本函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import os

# 字符串指示当前使用平台 win->'nt'; Linux->'posix'
print(os.name)

# 取得当前工作目录
print(os.getcwd())

# 切换当前工作目录
os.chdir('D:/')

# 创建目录
os.mkdir('test')

# 多级创建目录
os.makedirs('test/a/b')

# 列出指定目录的文件
print(os.listdir('D:/UMP/'))

# 文件重命名
os.rename('D:/00Projects/01.csv', 'D:/00Projects/001.csv')

# 去掉目录路径,返回文件名
print(os.path.basename('D:/lena.jpg'))

# 去掉文件名,返回目录路径
print(os.path.dirname('D:/lena.jpg'))

# 将分离的各部分组合成一个路径
print(os.path.join('D:/','lena.jpg'))

# 分解路径, 返回(dirname, basename)元组
print(os.path.split('D:/lena.jpg'))

# 分解文件名, 返回(filename, extension)元组
print(os.path.splitext('D:/lena.jpg'))

# 返回文件是否存在
print(os.path.exists('D:/UMP/lena.jpg'))

# 返回目录是否存在
print(os.path.exists('D:/UMP/'))

# 是否为绝对路径
print(os.path.isabs('D:/UMP/lena.jpg'))

# 从start开始计算相对路径
start = 'D:/00Projects/data'
print(os.path.relpath('D:/00Projects/001.csv', start))

# 转换path的大小写和斜杠
path = 'D:/00Projects/000/01.py'
print(path)
print(os.path.normcase(path))

# 返回list(多个路径)中,所有path共有的最长的路径
print(os.path.commonprefix(['D:/00Projects/000/01.py', 'D:/00Projects/000/02.py', 'D:/00Projects/test.jpg']))

# 是否为目录
print(os.path.isdir('D:/UMP/lena.jpg'))

# 是否为文件
print(os.path.isfile('D:/UMP/lena.jpg'))

# 是否为连接文件
print(os.path.islink('D:/UMP/lena.jpg'))

# 改变文件权限模式
os.chmod('D:/00Projects/1111.png', 777)

# 检验权限模式
print(os.access('D:/00Projects/1111.png', 777))

# 返回文件最近访问时间, 浮点型
print(os.path.getatime('D:/UMP/lena.jpg'))

# 返回文件上一次修改时间, 浮点型
print(os.path.getmtime('D:/UMP/lena.jpg'))

# 返回文件创建时间, 浮点型
print(os.path.getctime('D:/UMP/lena.jpg'))

# 返回文件大小, 字节单位
print(os.path.getsize('D:/UMP/lena.jpg'))

# 当前平台使用的行终止符,win下为'\t\n',Linux下为'\n'
print(os.linesep)

# 当前平台使用的路径连接符
print(os.sep)

# 当前平台使用的用户分割文件路径的字符串
print(os.pathsep)

# 运行命令,直接显示
os.system('start notepad') # 打开一个记事本

src = '/usr/bin/python'
dst = '/tmp/python'
# 创建软链接
os.symlink(src, dst)
# 创建硬链接
os.link(src, dst)

# 获取系统所有环境变量
print(os.environ)

#获取某个特定的环境变量的值
print(os.getenv('HOMEPATH'))
print(os.environ.get('HOMEPATH'))

# 设置环境变量
os.environ.setdefault('TP', 'D:/')
print(os.getenv('TP'))

# 获得当前系统登陆用户名
print(os.getlogin())

# 获得n个字节长度的随机字符串,通常用于加解密运算
print(os.urandom(100))

# 读取命令执行结果
print(os.popen('ping 127.0.0.1').read())

2、应用举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import os
FILE_DIR = os.path.dirname(os.path.abspath(__file__))

#========================================================
# 基本的文件操作
#========================================================

def get_filelist1(dir, postfix):
'''
按照后缀返回文件名列表
INPUT -> 目录地址, 文件后缀
OUTPUT -> 文件名列表
'''
return [os.path.join(dir, f) for f in os.listdir(dir) if f.endswith(postfix)]

def get_filelist2(dir, preffix):
'''
按照前缀返回文件名列表
INPUT -> 目录地址, 文件前缀
OUTPUT -> 文件名列表
'''
return [os.path.join(dir, f) for f in os.listdir(dir) if f.startswith(preffix)]

def get_file_postfix(filename):
'''
获取文件名后缀
INPUT -> 文件名
OUTPUT -> 文件后缀
'''
file = os.path.splitext(filename)
preffix, postfix = file
return postfix

def get_file_preffix(filename):
'''
获取文件名前缀
INPUT -> 文件名
OUTPUT -> 文件前缀
'''
file = os.path.splitext(filename)
preffix, postfix = file
return preffix

#========================================================
# 文件分割与合并
#========================================================

def file_chunkspilt(path, filename, chunksize):
'''
文件按照数据块大小分割为多个子文件
INPUT -> 文件目录, 文件名, 每个数据块大小
'''
if chunksize > 0:
filepath = path+'/'+filename
partnum = 0
inputfile = open(filepath, 'rb')
while True:
chunk = inputfile.read(chunksize)
if not chunk:
break
partnum += 1
newfilename = os.path.join(path, (filename+'_%04d' % partnum))
sub_file = open(newfilename, 'wb')
sub_file.write(chunk)
sub_file.close()
inputfile.close()
else:
print('chunksize must bigger than 0!')

def file_linespilt(path, filename, limit):
'''
文件按照行分割成多个子文件
INPUT -> 文件目录, 文件名, 行数
'''
if limit > 0:
preffix = get_file_preffix(filename)
postfix = get_file_postfix(filename)
file_count = 0
l_list = []
with open(path+'/'+filename, 'rb') as f:
for line in f:
l_list.append(line)
if len(l_list) < limit:
continue
subfile = preffix+"_"+str(file_count)+"."+postfix
with open(FILE_DIR+'/'+subfile, 'wb') as file:
for l in l_list[:-1]:
file.write(l)
file.write(l_list[-1].strip())
l_list=[]
file_count += 1
else:
print('limit must bigger than 0!')

def file_combine(path, filename):
'''
子文件合并
INPUT -> 文件目录, 文件名
'''
filepath = path+'/'+filename
partnum = 0
outputfile = open(filepath, 'wb')
subfile_list = get_filelist2(FILE_DIR, filename+'_')
for subfile in subfile_list:
temp = open(subfile, 'rb')
outputfile.write(temp.read())
temp.close()
outputfile.close()

二、sys常用方法

1、系统参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys

# 获取命令行参数,返回值是List,第一个元素是程序本身
print(sys.argv)

# 系统版本信息
print(sys.version)

# 模块搜索路径
print(sys.path)

# 打印所有已导入的模块列表
print(sys.modules.keys())

# 操作系统名称
print(sys.platform)

2、程序退出

sys.exit(n)执行程序退出,如果是正常退出是sys.exit(0),这里的参数可以自己填,但是对于程序是怎样退出的应该传参是几,应该自己定义好,这样别人在运行你的程序的时候才知道你是怎样退出的,是正常退出还是意外退出。

1
2
3
4
import sys
print('hello')
sys.exit(0)
print('world')

运行程序后发现程序输出hello后并没有继续输出world。因为在执行到sys.exit(0)的时候程序就结束了。

3、输入输出控制

在Python标准库的sys库中,主要有两个文件描述符,分别是stdin和stdout,分别代表标准输入、标准输出。

(1)标准输入

使用sys.stdin.readline()可以实现标准输入,其中默认输入的格式是字符串,如果是int,float类型则需要强制转换。

1
2
3
4
5
import sys

print('Plase input your name: ')
name = sys.stdin.readline()[:-1] # 去掉换行符
print('Hello ', name)
(2)标准输出

在python中调用print时,事实上调用了sys.stdout.write(obj+’\n’)
print 将需要的内容打印到控制台,然后追加一个换行符

1
2
3
4
import sys

sys.stdout.write('hello' + '\n')
print('hello')
(3)从控制台重定向到文件

原始的sys.stdout指向控制台,如果把文件的对象引用赋给sys.stdout,那么print调用的就是文件对象的write方法。

1
2
3
4
5
6
7
8
import sys
file = sys.stdout # 存储原始的输出对象
sys.stdout = open('1.txt', 'w') # 重定向所有的写入内容到 1.txt 文件,
print('Citizen_Wang') # 写入到 1.txt 文件中,在上一行语句中改变了输出流到文件中
print('Always fall in love with neighbours') # 继续写入到文件中
sys.stdout.close() # 其实就是 open 文件之后的关闭
sys.stdout = file # 将 print 命令的结果返回给控制台
print('输出信息返回在控制台') # 该信息会在控制台也显示