Python标准库(python标准库os中用来列出指定文件夹中的文件)

网友投稿 306 2022-08-25


Python标准库(python标准库os中用来列出指定文件夹中的文件)

模块

现在已经知道了通过​​import​​​从外部模块获取函数: 比如​​​import math​​

那么如何编写自己的模块呢

模块是程序

任何Python程序都可以作为模块导入

假设在/root目录下编写hello.py,内容为:

# hello.pyprint 'Hello'

进入python解释器:

>>> import sys>>> sys.path.append('/root')>>> import

在导入模块后,会有新文件出现:

-rw-r--r-- 1 root root 24 Jul 16 17:29 hello.py-rw-r--r-- 1 root root 110 Jul 16 17:30 hello.pyc

这个以​​.pyc​​​为扩展名的文件是经过编译的,如果再次导入同一个模块,Python会导入​​.pyc​​​文件而不是​​.py​​文件。

导入模块主要用于定义,比如导入变量、函数和类。只需要定义这些东西一次,因此多次导入和导入一次的效果一样。

模块用于定义

1.在模块中定义函数

#hello2.pydef hello(): print "Hello2"

运行:

>>> import hello2>>> hello2.hello()

2.在模块中增加测试代码

如果想要确保hello函数正常工作,可能会将hello2重写为新的模块(还是叫hello2):

#hello2.pydef hello(): print "Hello2"#testhello()

运行:

>>> import hello2Hello2>>> hello2.hello()

这可能不是想要的结果。我们得区分模块作为程序运行还是导入其他程序。为了实现这一点,需要使用​​__name__​​变量:

>>> __name__'__main__'>>> hello2.__name__'hello2'

在主程序(包括解释器的交互提示符中),变量​​__name__​​​是​​__main__​​而在导入的模块中,就是模块的名字。因此,我这样修改hello2:

#hello2.pydef hello(): print "Hello2"#testdef test(): hello()if __name__ == '__main__': test()

运行:

[root@instance-54lh4cfv ~]# python hello2.pyHello2[root@instance-54lh4cfv ~]# pythonPython 2.7.5 (default, Apr 9 2019, 14:30:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import hello2>>>

如果作为程序运行,​​hello​​函数会执行。而作为模块导入时,就不会执行。

让你的模块可用

前面的例子中,通过修改​​sys.path​​​来告知解释器去哪里查找模块。正常情况你不会每次都想这么做,那么有两种方法可以做到这一点: 将模块放到合适的位置;告诉解释器去哪里查找需要的模块。

1.将模块放在正确位置:

>>> import sys,pprint>>> pprint.pprint(sys.path) #提供更加智能的打印输出['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/python2.7/site-packages']

解释器可以从这些路径中查找模块,其中​​site-packages​​目录是最佳选择。将hello2.py放入该目录即可。

2.告诉编译器去哪里找

如果我们想将模块放在其他地方时可以采用这种方案。 通常是在​​​PYTHONPATH​​环境变量中包含模块所在的目录。

3.命名模块 包含模块代码的文件的名称要和模块名一样。

为了更好的组织模块,可以将它们分组为包。包就是另一类模块,它们能包含其他模块。其实就是模块的目录。

为了让python将其作为包对待,必须包含一个命名为​​__init__py​​的文件。

例如有个名为​​drawing​​​的包,其中包含名为​​shapes​​​和​​colors​​的模块。

引用代码:

import drawing # 此时drawing中__init__模块的内容是可用的import drawing.colors #此时colors模块是可用的,但是只能通过全名drawing.colors来使用from drawing import shapes#此时shapes模块可用,可以仅使用shapes来使用

标准库

标准库会随着Python解释器,一起安装在你的电脑中的。它是Python的一个组成部分。这些标准库是Python为你准备好的利器,可以让编程事半功倍。

下面介绍一些常见的标准库

sys

能通过该模块访问与python解释器关联紧密的变量和函数:

函数/变量

描述

argv

命令行参数,包括脚本名称

exit([arg])

退出当前程序

modules

映射模块名字到载入模块的字典

path

查找模块所在目录的目录名列表

platform

平台标识符

stdin

标准输入流

stdout

标准输出流

stderr

标准错误流

我们实现一个范旭打印命令行参数的脚本:

import sysargs = sys.argv[1:] #argv[0] is the file nameargs.reverse()print ' '.join(args)

执行并加入一些参数:

[root@root~]# python reverseargs.py this is a testtest

os

提供了访问多个操作系统服务的功能。

函数/变量

描述

environ

对环境变量进行映射

system(command)

在子shell中执行操作系统命令

sep

路径中的分隔符

pathsep

分隔路径的分隔符

linesep

行分隔符

urandom(n)

返回n字节的加密强随机数据

fileinput

该模块能让你轻松地遍历文件的所有行。

函数

描述

input([files[,inplace[,backup]]

遍历多个输入流中的行

filename()

返回当前文件的名称

lineno()

返回当前累计的行数

close()

关闭文件链

通过一个为代码编号的脚本来演示这个模块的使用:

import fileinput for line in fileinput.input(inplace=True): # True原地处理,即直接修改原文件 line = line.rstrip()#去除行尾空白符 num = fileinput.lineno()#得到行号 print '%-40s # %2i' % (line,num) #重写格式 内容 + #行号

如果你运行:​​python numberlines.py numberlines.py​​

import fileinput # 1for line in fileinput.input(inplace=True): # 2 line = line.rstrip() # 3 num = fileinput.lineno() # 4 print '%-40s # %2i' % (line,num) # 5 # 6

上面脚本中的中文注释是我后来加的。

谨慎的将inplace设为True,因为它很容易破坏文件。

堆和双端队列

它是优先队列的一种。python中没有独立的堆类型,只有一个包含一些堆操作函数的模块——​​heapq​​,包含6个函数:

函数

描述

heappush(heap,x)

x入堆

heappop(heap)

将堆中最小的元素弹出(原来这是一小顶堆)

heapify(heap)

通过列表构建堆

heapreplace(heap,x)

将堆中最小元素弹出,同时将x入堆

nlargest(n,iter)

返回iter中第n大的元素

nsmallest(n,iter)

返回iter中第n小的元素

前4个直接和堆操作相关,必须将列表作为堆对象本身(可以通过数组来实现堆,这里可以理解为是通过列表来实现的)。

>>> from heapq import *>>> from random import shuffle>>> data = range(10)>>> shuffle(data)>>> data[9, 8, 1, 0, 3, 4, 7, 6, 5, 2]>>> heapify(data) #可以直接通过列表构建堆>>> data[0, 2, 1, 5, 3, 4, 7, 6, 8, 9]>>> heappush(data,0.5) #将0.5如堆>>> data[0, 0.5, 1, 5, 2, 4, 7, 6, 8, 9, 3]>>> heappop(data) #弹出三个最小元素 0>>> heappop(data)0.5>>> heappop(data)1

关于堆的性质可参考Java二叉堆,虽然是用Java语言描述的,但是应该也不妨碍理解。

双端队列

双端队列(deque)也可通过可迭代对象创建:

>>> from collections import deque>>> q = deque(range(5))>>> qdeque([0, 1, 2, 3, 4])>>> q.append(5)>>> q.appendleft(6)>>> qdeque([6, 0, 1, 2, 3, 4, 5])>>> q.pop()5>>> q.popleft()6>>> q.rotate(3)>>> qdeque([2, 3, 4, 0, 1])>>> q.rotate(-1)>>> qdeque([3, 4, 0, 1, 2])

所谓双端是指可以在两端新增和删除元素。

​​rotate(n = 1)​​是将它们左移或右移,使头尾相连,当n是正数时,表示从左往右循环移n位,当n是负数时,表示从右往左循环移n位,比如deq.rotate(1)相当于deq.appendleft(deq.pop())

time

该模块可以获取当前时间、操作时间和日期、从字符串读取时间以及格式化时间为字符串。

很多Python函数用一个元组装起来的9组数字处理时间:

>>> import time>>> localtime = time.localtime(time.time())>>> print "本地时间为 :", localtime本地时间为 : time.struct_time(tm_year=2019, tm_mon=7, tm_mday=17, tm_hour=17, tm_min=43, tm_sec=34, tm_wday=2, tm_yday=198, tm_isdst=0)>>> localtime = time.asctime( time.localtime(time.time()) )>>> localtime'Wed Jul 17 17:44:13 2019'

random

包括返回随机数的函数

函数

描述

random()

返回0<n<=1之间的随机实数n

uniform(a,b)

返回随机数n,其中a<=n<b

randrange([start],stop,[step])

返回range(start,stop,step)中的随机数

choice(seq)

从序列seq中返回随机元素

shuffle(seq[,random])

原地对序列seq进行洗牌(打乱)操作


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《流畅的Python》读书笔记——Python一等函数(优雅的python)
下一篇:《流畅的Python》读书笔记——Python文本和字节序列
相关文章

 发表评论

暂时没有评论,来抢沙发吧~