Python中对文件流的操作,以及对json和pickle的理解

1.关于Python对文件流的操作:

格式:open( 文件名,模式,encoding=‘utf8’,buffering=-1 ) encoding->编码
buffering->缓存,默认-1

本人也是初学者,在Python官网上看到的相关的文档,说的不好还请谅解,指出。

文件及其组合模式

描述
‘r’ 只读模式
‘rb’ 只读模式(针对二进制文件)
‘w’ 只写模式(会覆盖掉已经有的内容)
‘wb’ 只写模式(针对二进制文件,覆盖已有内容)
‘a’ 追加模式(向已有的内容后面进行追加)
‘b’ 二进制模式
‘t’ 文本模式
‘+’ 读写模式,构成r+,w+,a+
‘U’ 通用匹配换行符模式

缓冲(buffering),默认为-1

描述
0或False 无缓冲,读写操作直接针对磁盘
1或True 有缓冲,只有使用flush或者close时才会写入磁盘
任意负数 表示默认缓冲区大小

读和写

方法名 描述
read([size]) 以字符串形式返回数据,可选参数size可以指定读取的字节数,如果未指定表示返回全部数据
write(str) 将字符串写入文件
readline() 以当前位置,从文件中读取一行,以字符串返回这行数据,offset指向下一行起始位置
readlines([size]) 将文件返回行为列表(list类型),可选参数size用于指定返回的行数;如果size未指定,表示返回所有行数
writelines() 将一个字符串列表一次性写入到文件中,不会加换行符

关闭、清空缓冲

方法名 描述
close() 关闭文件流
flush() 强制写入磁盘,并清空缓冲区

举些例子:

 ''' 
 格式:open( 文件名,模式,encoding='utf8',buffering=-1 )  encoding->编码  
 buffering->缓存,默认-1 
 
 返回值:file_object   的文件对象,它是一个可 iterable 的对象  ,所以可以直接循环
 '''
 
'''
1.写入内容到 'context.txt' 文本
'''

try:
    fo=open( 'context.txt','w',encoding='utf8' )  # 'w'模式会覆盖原文本,这里如果使用'w+'或者'a+'模式可以进行追加写入的内容
    texts=input('请输入您需要写入的内容:')
    fo.write( texts+'\n' )     #写入方法, '\n'自动换行(可以不写)
except:
    print("读取异常")
finally:
    fo.flush()              # 强制写入磁盘,并清空缓冲区
    fo.close()            #关闭文件流

'''
2.读取 'context.txt' 文本中的内容
'''

try:
    fo=open( 'context.txt','r+',encoding='utf8' )
    lines=fo.readlines()       #读取所有内容,返回的的是所有行的内容合起来的list类型
    for line in lines:            #循环每行
        print( line )                 #逐行输出
except:
    print("读取异常")
finally:
    fo.close()
    
'''
文件流操作也是可以通过 with 关键字来执行的,而且使用with关键字不用手动关闭流,
以及手动捕捉异常,因为它内部会自动帮我们关闭流并且处理异常
'''
with open( 'context.txt','r',encoding='utf8' ) as fo:       
    for line in fo.readlines():
        print(  line )
#我的SCDN博客里有篇文章有稍微详细的说 'with' 关键字的哦~

输入:
在这里插入图片描述
输出:

在这里插入图片描述

2.json序列化与反序列化操作

首先我们得知道什么叫序列化和反序列化?:
序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象。

json是轻量级的文本格式。 两种数据类型:
列表:[元素,元素]
字典:{ “键”:“值” }

方法名 描述
dumps 把python数据类型序列化为json相应的数据类型格式,操作于内存
loads 将json格式数据反序列为Python的相关类型的数据,操作于内存
dump 说通俗一点就是序列的是磁盘上的文件,操作于磁盘
load 反序列磁盘上的文件,操作于磁盘

举些例子:

import json

''' 1.dumps() '''
result=json.dumps( ['张三','李四','王五'] )
print(result)
-------------------------------------------------------------------------
["\u5f20\u4e09", "\u674e\u56db", "\u738b\u4e94"]    

'''
在序列化时,中文汉字总是被转换为unicode码,
在dumps函数中添加参数ensure_ascii=False即可解决。
'''
result=json.dumps( ['张三','李四','王五'],ensure_ascii=False )
print(result)
-----------------------------------------------------------------------------
["张三", "李四", "王五"]

''' 2.loads()'''
print(  json.loads(  result ) )
-----------------------------------------------------------------------------
["张三", "李四", "王五"]


''' 3.dump() '''
#以上都是将数据序列化到内存中,以下要序列化保存到磁盘上
with open( 'temp.txt,'w' ) as fp:    
    json.dump( [ { 'name':'张三'},{'age':20 } ] ,fp) #序列化后写入' temp.txt'文件夹

''' 4.load() '''
with open('temp.txt,'r') as fp:
    print(json.load( fp  ))         #将文件 'temp.txt'文件反序列化 
 ------------------------------------------------------------------------------
 [{'name': '张三'}, {'age': 20}]

3.pickle 模块 对象序列化

pickle与json不同的地方是:pickle模块是对象序列化,json是对文本格式的序列化

它与json也有同样的方法:dumps(),loads()和dump(),load()方法,并且用法一致。上面已经有关于json这些方法的应用了,我在这就不多说那些了,就说下它的“对象序列化”。即可以把Python里面的对象序列化。

import pickle
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def show(self):
        return self.name+' '+str(self.age)

p1=Person( '张三',20 )    #p1现在是一个Person对象
fp=open('Person.txt,'wb')
pickle.dump( p1,fp )   #将p1对象存入' Person.txt ' 中
fp.close()

fp=open( 'Person.txt,'rb' )
pp=pickle.load( fp )    #将' Person.txt ' 中的内容序列化出来得到Person对象
fp.close()
print( pp.show() )   #记得pp是对象,需要调用show()方法才能得到相应的值
-------------------------------------------------------------------
张三 20

把Person对象序列化存入’ Person.txt ’ 文件中的结果为:
在这里插入图片描述

——好了,以上就是我对Python中对文件流的操作,以及对json和pickle的理解。有疑问或不足的地方欢迎私聊进行探讨,谢谢。

猜你喜欢

转载自blog.csdn.net/qq_39022311/article/details/83548276