Python模块的学习:
1、os模块:
下面只对os模块中几个比较常用的方法做一些简单的示例:
os.system():这个方法在shell中体现的比较多,在dos命令行中也可以执行,下面就以在dos命令行中为例,说下system方法的作用(通过这个示例,大家对system方法的实用就一目了然了):
1 >>> import os 2 >>> print(os.system('ls')) 3 'ls' 不是内部或外部命令,也不是可运行的程序 4 或批处理文件。 5 1 6 >>> print(os.system('dir')) 7 驱动器 C 中的卷没有标签。 8 卷的序列号是 B8F2-0DE4 9 10 C:Users 的目录 11 12 2016/04/09 23:29 <DIR> . 13 2016/04/09 23:29 <DIR> .. 14 2016/04/09 23:27 <DIR> Administrator 15 2016/05/15 09:24 <DIR> Administrator.02CNFVTO5VIJUAD 16 2016/05/01 22:21 <DIR> Public 17 0 个文件 0 字节 18 5 个目录 27,973,791,744 可用字节 19 0 20 >>>
os.path.abspath(name):获得绝对路径
print(os.path.abspath(__file__)):获取当前的文件的绝对路径
os.path.join(path,name):连接目录与文件名或目录
os.path.dirname(path):返回文件路径
应用说明:当你在一个目录的模块中调用另一个目录下的模块的时候,就需要用到上面的几个方法:
(os.path.dirname(os.path.dirname(os.path.abspath(__file__))):这个结合的使用的作用是返回当前文件的上上级目录,然后再通过os.path.join方法去拼接其它的目录和文件,就可以找到其它目录的模块或者文件了。最后结合sys模块把要找的路径加到sys.path变量中去,就可以了。)
用os.path编写平台无关的程序
os.path.abspath("1.txt") == os.path.join(os.getcwd(), "1.txt")
os.path.split(os.getcwd()) 用于分开一个目录名称中的目录部分和文件名称部分。
os.path.join(os.getcwd(), os.pardir, 'a', 'a.doc') 全成路径名称.
os.pardir 表示当前平台下上一级目录的字符 ..
os.path.getctime("/root/1.txt") 返回1.txt的ctime(创建时间)时间戳
os.path.exists(os.getcwd()) 判断文件是否存在
os.path.expanduser('~/dir') 把~扩展成用户根目录
os.path.expandvars('$PATH') 扩展环境变量PATH
os.path.isfile(os.getcwd()) 判断是否是文件名,1是0否
os.path.isdir('c:Python26 emp') 判断是否是目录,1是0否
os.path.islink('/home/huaying/111.sql') 是否是符号连接 windows下不可用
os.path.ismout(os.getcwd()) 是否是文件系统安装点 windows下不可 用
os.path.samefile(os.getcwd(), '/home/huaying') 看看两个文件名是不是指的是同一个文件
os.path.walk('/home/huaying', test_fun, "a.c")
备注:在这里只对其它的一些方法做一些简单的介绍。
2、sys模块:
这个模块中的方法跟os中的方法相结合,可以实现一些路径的查找,(这个在上面也有提到)比如:
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))));找到所在文件的上上级目录,以后去其它目录下导入模块的时候,就可以直接使用'from 路径 import 模块' 这种形式来实现了。
当Python执行import sys语句的时候,它在sys.path变量中所列目录中寻找sys.py模块。如果找到了这个文件,这个模块的主块中的语句将被运行,然后这个模块将能 够被你 使用 。注意,初始化过程仅在我们 第一次 输入模块的时候进行。另外,“sys”是“system”的缩写。
sys模块中的argv变量通过使用点号指明——sys.argv——这种方法的一个优势是这个名称不会与任何在你的程序中使用的argv变量冲突。另外,它也清晰地表明了这个名称是sys模块的一部分。
sys.argv变量是一个字符串的 列表 (列表会在后面的章节详细解释)。特别地,sys.argv包含了 命令行参数 的列表,即使用命令行传递给你的程序的参数。
如果你使用IDE编写运行这些程序,请在菜单里寻找一个指定程序的命令行参数的方法。
这里,当我们执行python using_sys.py we are arguments的时候,我们使用python命令运行using_sys.py模块,后面跟着的内容被作为参数传递给程序。Python为我们把它存储在sys.argv变量中。
记住,脚本的名称总是sys.argv列表的第一个参数。所以,在这里,'using_sys.py'是sys.argv[0]、'we'是 sys.argv[1]、'are'是sys.argv[2]以及'arguments'是sys.argv[3]。注意,Python从0开始计数,而非从1开始。
sys.path 包含输入模块的目录名列表。我们可以观察到sys.path的第一个字符串是空的——这个空的字符串表示当前目录也是sys.path的一部分,这与 PYTHONPATH环境变量是相同的。这意味着你可以直接输入位于当前目录的模块。否则,你得把你的模块放在sys.path所列的目录之一。
arg3
3、下面再简单的介绍几个模块:
json(pickle):序列化和反序列化的实现,看下面的实例。
1 import json 2 f = open('test','r') 3 line = f.readlines() 4 user_dict = line[0] 5 print(type(user_dict)) 6 user_dict = json.load(user_dict) 7 print(type(user_dict)) 8 9 #输出结果 10 <class 'str'> 11 File "D:/PycharmProjects/s13/test/test.py", line 54, in <module> 12 user_dict = json.load(user_dict) 13 File "D:python35libjson\__init__.py", line 265, in load 14 return loads(fp.read(), 15 AttributeError: 'str' object has no attribute 'read'
我们一步一步的进行分析,首先输出的第一行证明了,代码的前五行还没有出现问题;那么由代码的报错信息可知,是第六行出现了问题,但是user_dict确实字符串,而json.load确实是反序列化输出(就是把字符串转换成字典类型),纠结的好长时间才发现原来是test文件的问题,有的人就会问了,它会有什么问题,有问题的话,也不会出街结果了啊。这句话问的好,我们可以先看下test文件的内容:
{'name':'alex','age':26} ,其实就是这么一个简单的字典。那么我们先把单引号换成双引号试试 ==》{"name":"alex","age":26}
结果发现还是不行,这时候突然想起来还有一个loads,,,奥,这时候才发现自己犯了一个多么低级的错误,load是读取文件的内容并反序列化输出,而loads是把字符串反序列化输出,我们上面写的代码是把文件中的内容输出成一个字符串了,所以用load肯定是不行了,应该用json.loads(user_dict)才可以;如果用load 去加载的话,会更方便:
user_dict_json = json.load(open('test','r')) print(type(user_dict_json)) print(user_dict_json) #输出结果 <class 'dict'> {'name': 'alex', 'age': 26}
现在大家应该是一目了然了吧,我相信你现在也是恍然大明白的!!!
下面再来说下json的dump和dumps方法:
大家现在都知道了,json.load和json.loads是反序列化输出一个结果,dump和dumps跟json.load和json.loads正好相反,是序列化输出到终端或者文件中去。看下面这个实例:
1 import os 2 import json 3 4 str = 'This is a dump test' 5 dict = {'name':'alex','age':22} 6 print(json.dumps(str)) 7 print(json.dumps(dict)) 8 print(json.dump(dict)) 9 10 #输出结果 11 "This is a dump test" 12 {"age": 22, "name": "alex"} 13 Traceback (most recent call last): 14 File "D:/PycharmProjects/test/test.py", line 8, in <module> 15 print(json.dump(dict)) 16 TypeError: dump() missing 1 required positional argument: 'fp'
从这段代码中,我们可以总结出以下几点:
1、dumps是输出到终端的操作方法,也就是把一个类型的变量转换成str类型的操作;dump是对文件操作的方法,具体的操作是这样的,json.dump(dict,open('test','w'))
2、不管你输入的变量中带有的是单引号,还是双引号,dump和dumps都会给你转换成双引号,因为只有这样,在你做load或者loads的时候,它才能反序列化输出。
pickle的load、loads和dump、dumps的使用操作:
先来说下,pickle和json的差异:
1、pickle和json都可以实现序列化和反序列化的操作。
2、在写入文件的时候,pickle是以加密的方式写入的。
3、pickle可以对类创建的对象进行反序列化输入到文件中。
下面对pickle的load和dump做个简单的实例:
1 import pickle 2 3 class teacher: 4 def __init__(self,favor,name,age): 5 self.favor = favor 6 self.name = name 7 self.age = age 8 self.asset = 0 9 10 def reduce(self): 11 self.asset = self.asset - 100 12 def gain(self,value): 13 self.asset += value 14 15 tech1 = teacher('打球','toney',28) 16 tech2 = teacher('鸡汤','alex',30) 17 tech3 = teacher('睡觉','tim',25) 18 tech_list = [tech1,tech2,tech3] 19 tech_file = open('teacher','wb') 20 pickle.dump(tech_list,tech_file) 21 tech_file.close() 22 23 class course: 24 li = pickle.load(open('teacher','rb')) 25 print(li[0]) 26 print(li[0].name) 27 28 #输出结果 29 <__main__.teacher object at 0x0000000000802B70> 30 toney
这里面涉及到了一些面向对象的知识,如果不懂面向对象的话,大家可以略过,只看pickle的dump和load方法就行,有两点需要注意的是,pickle存到文件中的数据是加密过的。在打开文件的时候,‘wb’是以二进制的形式写入。
4、接下来聊聊时间模块,这几个模块还是比较有意思的,以后在写脚本的时候也会用到的比较多:
time: 这个模块所表示的时间格式不太明显,不太容易被公众所调用。
datetime:这个模块输出的时间格式更直观,也是用的最多的:
datetime模块定义了下面这几个类:
-
-
- datetime.date:表示日期的类。常用的属性有year, month, day;(比如,当你执行datetime.date.today()的时候,就会显示今天的年月日)
- datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond;
- datetime.datetime:表示日期时间。(比如:datetime.datetime.today(),就会列出当前时刻的时间)
- datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
-