Python学习第38天(文件处理,ossyspickle模块复习)

Posted 崆峒山肖大侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习第38天(文件处理,ossyspickle模块复习)相关的知识,希望对你有一定的参考价值。

今天部分的内容会写的比较随意,想到需要复习的知识我就会进行一下演示,这样便于尽快把欠下的课程选择部分和即将要开始的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\\n222\\n\') #针对文本模式的写,需要自己写换行符
    f.write(\'1111\\n222\\n\'.encode(\'utf-8\')) #针对b模式的写,需要自己写换行符
    f.writelines([\'333\\n\',\'444\\n\']) #文件模式
    f.writelines([bytes(\'333\\n\',encoding=\'utf-8\'),\'444\\n\'.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下为"\\t\\n",Linux下为"\\n"
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的实现,差不多就是百度网盘的功能实现吧

 

睡觉了!!!

 

以上是关于Python学习第38天(文件处理,ossyspickle模块复习)的主要内容,如果未能解决你的问题,请参考以下文章

第26天python学习文件批量处理

Python学习第106天(Django的静态文件staticurl分组)

python 学习第7天

python学习之第八天补充

21天python打卡第9天 基础技能

20200527----python学习第21天