Python模块的介绍

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所列的目录之一。

    

import sys
 
print sys.argv[0]
print sys.argv[1]
print sys.argv[2]
print sys.argv[3]
那么
[root@databak scripts]# python test.py arg1 arg2 arg3
test.py
arg1
arg2

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
View Code

    这里面涉及到了一些面向对象的知识,如果不懂面向对象的话,大家可以略过,只看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:表示时间间隔,即两个时间点之间的长度。

    

 

原文地址:https://www.cnblogs.com/madq-py/p/5595897.html