zoukankan      html  css  js  c++  java
  • 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:表示时间间隔,即两个时间点之间的长度。

        

     

  • 相关阅读:
    MySql 踩坑小记
    Redux 实现过程的推演
    正则表达式的一些探索(偏JavaScript)
    [python工具] 如何使用plotly制作散列图
    使用epoll实现一个udp server && client
    python 实现一个简单tcp epoll socket
    [原创]差分放大器阻抗匹配计算+阻抗计算小工具
    将博客搬至CSDN
    [转]谈NAND Flash的底层结构和解析
    [原创]Fashion汽车定位器拆解
  • 原文地址:https://www.cnblogs.com/madq-py/p/5595897.html
Copyright © 2011-2022 走看看