• Python-常用模块2


      今天我们继续来看模块的那些事儿

    一.os模块

      所有和操作系统相关内容都在os模块

    os.makedirs('dirname1/dirname2')  可生成多层递归目录
    os.removedirs('dirname1')  若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,以此类推
    os.mkdir('dirname')  生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')  删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')  列出指定目录下的所有文件和目录,包括隐藏文件,并以列表方式打印
    os.remove() 删除一个文件
    os.rename('oldname','newname')  重命名文件/目录
    os.stat('path/filename') 获取文件/目录信息
    os.system('bash command')  运行shell命令,直接显示
    os.popen('bash command').read()  运行shell命令,获取执行结果
    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir('dirname') 改变当前脚本工作目录;相当于shell下cd
    
    #os.path
    os.path.abspath(path) 返回path规范化的绝对路径
    os.path.split(path) 将path分割成目录和文件名二元组返回
    os.path.dirname(path) 返回path的目录,其实就是os.path.split(path) 的第一个元素
    os.path.basename(path) 返回path最后的文件名,如何path以/或结尾,那么就返回空值,即os.path.split(path)的第二个元素
    os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
    os.path.isabs(path)  如果path是绝对路径,返回True
    os.path.isfile(path) 如果path是一个存在的文件,则返回True,否则返回False
    os.path.isdir(path) 如果path是一个存在的目录,则返回True,否则返回False
    os.pathjoin(path1[,path2[,...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
    os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
    os.path.getsize(path) 返回path的大小
    
    #特殊属性
    os.sep 输出操作系统特定的路径分隔符,win下为'\',Linux下为'/'
    os.linesep 输出当前平台使用的行为终止符,win下为'
    ',Linux下'
    '
    os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
    os.name 输出字符串指示当前使用平台,win -> 'nt' ; Linux -> 'posix'
    

      os.stat() 属性解读:

    stat结构:
    
    st_mode:inode保护模式
    st_ino:inode 节点号
    st_dev:inode 驻留的设备
    st_nlink: inode 的链接数
    st_uid:所有者的用户ID
    st_gid:所有者的组ID
    st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据
    st_atime:上次访问的时间
    st_mtime:最后一次修改的时间
    st_ctime:由操作系统报告的'ctime',在某些系统上(如Unix)是最新的元数据更改的时间,在其他系统上(如Windows) 是创建时间(详细信息参见平台的文档)

    二.sys模块

      所有和python解释器相关的都在sys模块

    sys.argv  命令行参数list,第一个元素是程序本身路径
    sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
    sys.version  获取python解释程序的版本信息
    sys.path     返回模块的搜索路径,初始化时使用PYTHONPATH环境变量值
    sys.platform   返回操作系统平台名称

    三.序列化

      在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个过程叫序列化,不同的序列化结果也不同,但是目的是一样的,都是为了存储和传输

      在python中存在两种序列化大方案:

        1.pickle,可以将我们Python中的任意数据类型转化成bytes并写入文件中,同样也可以把文件中写好的bytes转换回我们python的数据,这个过程被称为反序列化

        2.json,将python中常见的字典,列表转化成 字符串,是目前前后端数据交互使用频率最高的一种数据格式.

    四.pickle(重点)

      pickle用起来很简单,说白了就是把我们的python对象写入到文件中的一种解决方案,但是写入到文件的是bytes,所以这东西不是给人看的,是给机器看到

    import pickle
    
    class Cat:
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def catchMouse(self):
            print(self.name,'抓老鼠')
    c = Cat('jerry',18)
    
    bs = pickle.dumps(c)  #序列化一个对象
    print(bs)  #一堆二进制,看不懂
    
    cc = pickle.loads(bs)  #把二进制反序列化成我们的对象
    cc.catchMouse()  #猫依然是猫,还可以抓老鼠
    

      pickle中的dumps可以序列化一个对象,loads可以反序列化一个对象,我们使用dump还可以直接把一个对象写入到文件中

    #f = open('cat',mode = 'wb')
    #pickle.dump(c,f) #写入到文件中
    #f.close()
    
    f = open('cat',mode = 'rb')
    cc = pickle.load(f)  #从文件中读取对象
    cc.catchMouse()
    

      pickle还支持多个对象的写出:

    lst = [Cat('jerry',19),Cat('tommy',20),Cat('alpha',21)]
    
    f = open('cat',mode = 'wb')
    for el in lst:
        pickle.dump(el,f)  #写入到文件中
    f.close()
    
    f = open('cat',mode = 'rb')
    for i in range(len(lst)):
        cc = pickle.load(f)  #从文件中读取对象
        cc.catchMouse()
    

      但是这样写并不够好,因为读的时候并不能知道有多少对象要读,这里记住,不能一行一行的读,那真的要写入或者读取多个内容怎么办?很简单,装列表里,然后读取和写入都用列表

    lst = [Cat('jerry',19),Cat('tommy',20),Cat('alpha',21)]
    
    f = open('cat',mode = 'wb')
    pickle.dump(lst,f)
    
    f = open('cat',mode = 'rb')
    l1 = pickle.load(f)
    for el in l1:
        el.catchMouse()
    

      记住一点,pickle序列化的内容是二进制的内容(bytes)不是给人看的

    五.json(重点)

      终于到json了,json是我们前后端交互的枢纽,相当于编程界的普通话,大家沟通都用json,为什么这样呢?因为json的语法格式可以完美的表示出一个对象,那什么是json:json全称javascript object notation,翻译过来叫js对象简谱,很复杂是吧.来上一段我们认识的代码:

    wf = {
            'name':'汪峰',
            'age':18,
            'hobby':'上头条',
            'wife':{
                'name':'子怡',
                'age':19,
                'hobby':['唱歌','跳舞','演戏']
        }
    }
    

      这个不是字典么?对的,在Python里这玩意叫字典,但是在javascript里这东西叫json,一模一样的,我们发现用这样的数据结构可以完美的表示出任何对象,并且可以完整的把对象表示出来,只要代码格式比较好,那可读性也是很强的,所以大家公认用这样一种数据结构作为数据交互的格式,那这个鬼东西之前是什么呢?XML...来看一段代码:

    <?xml version="1.0" encoding="utf-8" ?>
    <wf>
        <name>汪峰</name>
        <age>18</age>
        <hobby>上头条</hobby>
        <wife>
            <name>⼦怡</name>
            <age>18</age>
            <hobbies>
                <hobby>唱歌</hobby>
                <hobby>跳舞</hobby>
                <hobby>演戏</hobby>
            </hobbies>
        </wife>
     
    </wf>
    

      古人(老程序员)都是用这样的数据进行传输的,先不管这个东西好不好看,这玩意想要解析.. 那简直了. 想死的心都有,所以老版本的xml在维护和处理上是非常复杂和繁琐的,多说一嘴, 就是因为这个鬼东西太难解析,以前的项目几乎没有用ajax的. 

      OK,那json既然这么牛B好用, 怎么用呢? 注意,这里又出来一个新问题,我们的程序是在python里写的,但是前端是在JS那边来解析json的,所以,我们需要把我们程序产生的字典转化成json格式的json串(字符串),然后网络传输,那边接收到了之后,它爱怎么处理是它的事情. 那如何把字典转化成我们的json格式的字符串呢?很简单, 上代码:

    import json
    dic = {'a':'女王','b':'萝莉','c':'小清新'}
    s = json.dumps(dic) #把字典转化成json字符串
    print(s)    #{"a": "u5973u738b", "b": "u841du8389", "c": "u5c0fu6e05u65b0"}
    

      结果不友好啊,那如何处理中文呢?在dumps的时候给出另一个参数ensure_ascii = False就可以了

    import json
    dic = {'a':'女王','b':'萝莉','c':'小清新'}
    s = json.dumps(dic,ensure_ascii = False) #把字典转化成json字符串
    print(s)  #{"a": "女王", "b": "萝莉", "c": "小清新"}
    

      搞定了,接下来,前端给你传递信息了,你要把前端传递过来的json字符串转化成字典

    import json
    
    s = '{'a':'女王','b':'萝莉','c':'小清新'}'
    dic = json.loads(s)
    print(type(dic),dic)
    

      搞定,是不是很简单,以上两个代码要求记住,理解,背会

      json也可以像pickle一样把序列化的结果写入到文件中

    dic = {'a':'女王','b':'萝莉','c':'小清新'}
    f = open('test.json',mode = 'w',encoding = 'utf-8')
    json.dump(dic,f,ensure_ascii = False)  #把对象打散成json写入到文件中
    f.close()
    

      同样也可以从文件中读取一个json

    f = open('test.json',mode = 'r',encoding = 'utf-8')
    dic = json.load(f)
    f.close()
    print(dic)
    

      注意,我们可以向同一个文件中写入多个json串,但是读不行

    import json
    
    lst = [{'a':1},{'b':2},{'c':3}]
    
    f = open('test.json',mode = 'w',encoding = 'utf-8')
    
    for el in lst:
        json.dump(el,f)
    f.close()
    

      注意,此时文件中的内容是一行内容

    {"a": 1}{"b": 2}{"c": 3}

      这在读取的时候是无法正常读取的,那如何解决呢?两套方案,方案一:把所有的内容准备好统一进行写入和读取,但是这样处理如果数据小还好,数据量大的话就不够友好了,方案二:不用dump,改用dumps和loads,对每一行分别进行处理

    import json
    
    lst = [{'a':1},{'b':2},{'c':3}]
    
    #写入
    f = open('test.json',mode = 'w',encoding = 'utf-8')
    for el in lst:
        s = json.dumps(el,ensure_ascii = True) + '
    '
        f.write(s)
    f.close()
    
    #读取
    f = open('test.json',mode = 'r',encoding = 'utf-8')
    for line in f:
        dic = json.loads(line.strip())
        print(dic)
    f.close()
    

      

  • 相关阅读:
    AS3入门教程3流程控制
    C#里面的datagridview的使用
    .NET 2.0 WinForm Control DataGridView 数据绑定
    FLASH实用代码大全
    C#中回滚SQL语句
    AS3工程中的Loading的应用
    AS3类库资源大集合
    Flash(FLV)视频播放器开源代码大集合
    一位高手整理的IIS FAQ
    Flash ActionScript 3编程的总结
  • 原文地址:https://www.cnblogs.com/pythoncainiao/p/10186343.html
Copyright © 2020-2023  润新知