zoukankan      html  css  js  c++  java
  • Python学习第38天(文件处理,os、sys、pickle模块复习)

    今天部分的内容会写的比较随意,想到需要复习的知识我就会进行一下演示,这样便于尽快把欠下的课程选择部分和即将要开始的ftp实现任务尽快完成。

    一、文件处理部分

      打开文件的一个固定格式:文件句柄 = open('文件路径', '模式')

      模式有以下:

      1. 打开文件的模式有(默认为文本模式):
        r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
        w,只写模式【不可读;不存在则创建;存在则清空内容】
        a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】

      2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
        rb   wb  ab
        注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

      3. 别的部分
        "+" 表示可以同时读写某个文件
        r+, 读写【可读,可写】
        w+,写读【可读,可写】
        a+, 写读【可读,可写】


        x, 只写模式【不可读;不存在则创建,存在则报错】
        x+ ,写读【可读,可写】
        xb

      4.文件打开之后的一些操作方法:

        f.read() #读取所有内容,光标移动到文件末尾
        f.readline() #读取一行内容,光标移动到第二行首部
        f.readlines() #读取每一行内容,存放于列表中

        f.write('1111 222 ') #针对文本模式的写,需要自己写换行符
        f.write('1111 222 '.encode('utf-8')) #针对b模式的写,需要自己写换行符
        f.writelines(['333 ','444 ']) #文件模式
        f.writelines([bytes('333 ',encoding='utf-8'),'444 '.encode('utf-8')]) #b模式

      5.文件内的光标移动:

        (1)read(3):

          1. 文件打开方式为文本模式时,代表读取3个字符

          2. 文件打开方式为b模式时,代表读取3个字节

        (2)其余的文件内光标移动都是以字节为单位如seek,tell,truncate

          注意:

          1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

          2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

      6.文件的修改

      文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

      (1)将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)  

    import os
    with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
        data=read_f.read() #全部读入内存,如果文件很大,会很卡
        data=data.replace('alex','SB') #在内存中完成修改
        write_f.write(data) #一次性写入新文件
    
    os.remove('a.txt')
    os.rename('.a.txt.swap','a.txt')

      (2)将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

    import os
    
    with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
        for line in read_f:
            line=line.replace('alex','SB')
            write_f.write(line)
    
    os.remove('a.txt')
    os.rename('.a.txt.swap','a.txt')

      关于文件操作的就是这些内容了

    二、os模块

      os模块是一个与系统交互的窗口,关于他的内置方法,大概有下面这么多吧。

    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
    os.curdir  返回当前目录: ('.')
    os.pardir  获取当前目录的父目录字符串名:('..')
    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.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    os.linesep    输出当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
    os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    os.system("bash command")  运行shell命令,直接显示
    os.environ  获取系统环境变量
    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.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
    os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
    os.path.getsize(path) 返回path的大小

      没来得及挨个尝试,但是里面最重要的就是os.path.dirname   os.path.abpath    os.path.join

      尤其是最后面这个join会用在很多存放数据库时候的变量操作。

      刚才说的这三个是我们才进行文件模块导入的时候最常用的

      BASE_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) )

      sys.append( BASE_DIR)

      通过上面这两句操作就可以将原本的默认路径由主执行文件目录,修改为bin文件的上一级目录,后面就可以进行 from 文件夹 import  .py文件

    三、sys模块

      主要有这么几个内置函数

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

      比较重要的,也是后面在实际操作过程中最为常用的就sys.argv

      这部分的引入,可以使程序不会因为相关输入而导致程序的中断,在程勋运行的最开始段就进行相关参数的录入,并且可以通过标识进行定点调用

    四、pickle模块

      其实只要说起pickle模块,就不得不说一下json模块,他们两个其实是差不多的,而且jason模块时目前正在推广的

      之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值。

      pickle&json的作用

        1:持久保存状态

        需知一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,'状态'会以各种各样有结构的数据类型(也可简单的理解为变量)的形式被保存在内存中。

    内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。

    在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

    具体的来说,你玩使命召唤闯到了第13关,你保存游戏状态,关机走人,下次再玩,还能从上次的位置开始继续闯关。或如,虚拟机状态的挂起等。

        2:跨平台数据交互

        序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

    然后是演示:

    import pickle 
    dic={'name':'alvin','age':23,'sex':'male'} 
    print(type(dic))#<class 'dict'> 
    j=pickle.dumps(dic)
    print(type(j))#<class 'bytes'> 
    f=open('序列化对象_pickle','wb')#注意是w是写入str,wb是写入bytes,j是'bytes'
    f.write(j)  #-------------------等价于pickle.dump(dic,f) 
    f.close()
    #-------------------------反序列化
    import pickle
    f=open('序列化对象_pickle','rb') 
    data=pickle.loads(f.read())#  等价于data=pickle.load(f) 
    print(data['age'])

    以上就是今天的复习内容,其实今天也是看了一些视频的,但是发现视频里面的人练习的很到位,脑子还是不够,回答不上来,但是我貌似就会哔哔,最终却不知道怎么兑现,最近有点忙,得好好休息一下脑子,专心做一下纪检监察人员了。

    明天进行选课程序的实现,之前做了一部分,后续还是应该继续搞定,不过也有可能进行ftp的实现,差不多就是百度网盘的功能实现吧

    睡觉了!!!

  • 相关阅读:
    开发工程师的职场人生路
    10 ASP.NET Performance and Scalability Secrets(转载推荐)
    手机号码归属地查询接口大全
    参数的秘密“纠结”的压缩比
    爱情本来并不复杂,来来去去不过三个字
    假如苹果、微软、谷歌造汽车 他们的区别是什么
    tomcat修改jsessionid在cookie中的名称
    virtualBox 中 linux 系统 相关配置
    htpasswd用法
    linux 防火墙
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/12608997.html
Copyright © 2011-2022 走看看