Python学习笔记08——文件操作及IO流

1打开文件(获取文件操作对象)

语法:

var f=open(filepath,mode="r",buffering=-1,encoding="",......)

filepath:为文件路径
mode:为读取模式,主要有如下操作

符号含义备注
r只读只能读,默认光标在文件开头
rb二进制只读以二进制读取
r+读写先读后写,开始光标在开头,读取操作后光标后移,继续写则为中间改写或末尾续写
rb+二进制读写
w只写只能写入,且是复写,无论文件是否存在,都是重新写入。且此语句一经执行会将本存在的文件写为空白,无论是否开始write的动作
wb二进制写入以二进制写入
w+写读先写后读,也就是文件一打开也是空白的
wb+二进制写读
a追加向已有文件追加内容,光标初始在文件末尾。如果文件不存在则创建新文件
ab二进制追加追加二进制内容
a+追加读写光标默认在文件末尾
ab+二进制追加读写

示例:

#####r,r+,w,w+,a,a+的区别:https://www.cnblogs.com/python-coder/p/10078253.html
txt = "poem.txt"

#读取模式
poem = open(txt,encoding="utf-8",mode="r")
print(poem.readlines())#全部读取返回一个list,每行一个元素
print(poem.readline())#读取一行,同时光标移动到下一行
print(poem.read())#只有a时不能读取,可读取模式r,r+,w+,a+,读取所有,光标移动到最后
poem.close()#关闭流

#写入模式
txt2="temp.txt"
temp=open(txt2,mode="w",encoding="utf-8")
temp.write("临时文件")
temp.writelines(["第一行","第二行","第三行"])
temp.close()#关闭流

#追加模式
txt3="append.txt"
append=open(txt3,"a+",encoding="utf-8")
append.write("追加条件")#连续追加而不是换行追加
append.writelines(["第一行","第二行","第三行"])#同样不换行
append.writelines(["第一行\n","第二行\n","第三行\n"])#手动添加换行符才能换行
append.close()#关闭流

####利用with自动关闭文件流
with open(txt,mode="r",encoding="utf-8") as reader:
    print(reader.read())

注意事项:
①文件的追加写入都不会自动换行,需要自己在字符串中写入“/n”
②IO流一定要关闭,否则会影响内存,同时同一文件操做的流会互相影响光标位置;
③用with open() as var:来自动关闭IO流

2.字符和字节的内存写入

2.1StringIO

StringIO通过import io标准库,通过创建StringIO的对象来实现对字符串存在内存的操作。对象的操作同文件操作IO流。注意点是StringIO的写入同时光标会同步移动,写入后不移动光标直接使用read()无法读取文本,可以通过getValue()获取文本。
示例:

from io import StringIO
#将字符串写入内存而不是写入本地硬盘 (临时性储存)
#操作对象只能是string,不能时Byte0

#####存入
f=StringIO()#创建一个StringIO对象
f.write("hello\n")
f.write("world\n")
print(f.read())#指标在最后,读取为空
print(f.getvalue())#获取所有文本

#如此创建的光标还在头部,可以从头读取
f1=StringIO("hello\nworld\n")
while True:
    s=f1.readline()
    if s:
        print(s)
    else:
        break

运行结果:

hello
world

hello

world

2.2ByteIO

ByteIO同样属于IO标准库,不同之处在于ByteIO只能读写字节,因此需要进行编码和解码:
.encode()和.decode()
示例:

from io import BytesIO
#用于临时储存二进制文件

###存入和输出的都是二进制符,需要编转码
b=BytesIO()
b.write("hello,您好".encode("utf-8"))
print(b.getvalue())
print(b.getvalue().decode("utf-8"))

运行结果:

b'hello,\xe6\x82\xa8\xe5\xa5\xbd'
hello,您好

3.序列化和反序列化

3.1二进制转化

使用模块pickle,序列化操作dump(obj,iostream),反序列化操作:loads(data)
序列化操作:
dump的第一个参数为被序列化对象,第二个参数为IO流对象,因此需要open一个io流对象
反序列化操作:
loads(data)为数据对象,因此需要传入IO流对象read()获取的文本数据
代码示例:

####序列化与反序列化(二进制)
import pickle

class Student:
    def __init__(self,id=0,name="",gender=""):
        self.id=id
        self.name=name
        self.gender=gender
    #用于更新数据,根据传入的字典更新对象的属性
    def config(self,entries):
        self.__dict__.update(entries)

studentA=Student(1,"小明","male")
txt = "student.txt"

#序列化操作
b = open(txt, mode="wb+")#byte模式不需要传入编码格式参数
pickle.dump(studentA,b)
b.close()

#反序列化操作
reader = open(txt, "rb")
f = reader.read()
student = pickle.loads(f)
print(student.id,student.name,student.gender)

运行结果:

1 小明 male

3.2JSON格式转化

运用模块json,运用方法dump(dict,iostream),loads(data)
序列化:
dump第一个参数需要传入dict对象,因此需要从待序列化对象获取其dict,直接用.__dict__可以获取
第二个对象需要i哦stream,因此操作同二进制转化;
反序列化:
loads返回的对象为一个dict对象,要将其转化为类对象,需要通过__init__用dict对象创建类对象,或者创建初始类对象,通过dict对象修改该对象,其方法如下:

class Student:
    def __init__(self,id=0,name="",gender=""):
        self.id=id
        self.name=name
        self.gender=gender
    #用于更新数据,根据传入的字典更新对象的属性
    def config(self,entries):
        self.__dict__.update(entries)

代码示例:

####序列化与反序列化(JSON文件)
import json
from  day03.Test04 import Student

studentB=Student(1,"韩梅梅","female")
studentJ="student.json"

###序列化
b= open(studentJ, "w")
stuDict = studentB.__dict__#将对象转化为dict对象,对应着json中的obj对象
json.dump(stuDict,b)
b.close()###############################重点!!!,必须要close掉,不然会影响后续读取的光标位置

###反序列化
reader=open(studentJ)
f= reader.read()
#加载成字典
stDic = json.loads(f)
print(stDic)
#将字典转化为类对象
student=Student()
student.config(stDic)
print(student.id,student.name,student.gender)

程序运行结果:

1 韩梅梅 female
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值