Python with 工作原理、装饰器、回收机制、内存管理机制、拷贝、作用域等( 四 )


f.write 文件的操作 关键字:open(“文件名称” , mode=“操作” , = “编码方式”)
f = open("helloworld.txt", 'r+t', encoding="utf-8")print(f)# <_io.TextIOWrapper name='helloworld.txt' mode='r' encoding='cp936'># f的值是一种变量,占用的是应用程序的内存空间print("第一次读".center(50, "*"))print(f.read())print("第二次读".center(50, "*"))print(f.read())f.seek(0)print("第三次读".center(50, "*"))print(f.read())f.close()# <_io.TextIOWrapper name='helloworld.txt' mode='r+t' encoding='utf-8'># ***********************第一次读***********************# 你好时间 我喜欢你唤醒手腕# ***********************第二次读***********************# # ***********************第三次读***********************# 你好时间 我喜欢你唤醒手腕
========= ===============================================================Character Meaning--------- ---------------------------------------------------------------'r'open for reading (default)'w'open for writing, truncating the file first'x'create a new file and open it for writing'a'open for writing, appending to the end of the file if it exists'b'binary mode't'text mode (default)'+'open a disk file for updating (reading and writing)'U'universal newline mode (deprecated)========= ===============================================================
错误演示 : t 模式只能读文本文件
with open(r'爱nmlab的爱情.mp4', mode='rt') as f:f.read()# 硬盘的二进制读入内存-》t模式会将读入内存的内容进行decode解码
无论是在字符流读取 , 还是字节流读取 , for line in f 都是以 \n 换行符作为分隔的
with open(r"helloworld.txt", 'rb') as f:for line in f:print(line)# 无论是在字符流读取 , 还是字节流读取 , for line in f 都是以 \n 换行符作为分隔的
内容过大会导致内存溢出的解决方案
# f.read()与f.readlines()都是将内容一次性读入内容 , 如果内容过大会导致内存溢出 , 若还想将内容全读入内存 , 则必须分多次读入 , 有两种实现方式:# 方式一with open('a.txt',mode='rt',encoding='utf-8') as f:for line in f:print(line) # 同一时刻只读入一行内容到内存中# 方式二with open('1.mp4',mode='rb') as f:while True:data=http://www.kingceram.com/post/f.read(1024) # 同一时刻只读入1024个Bytes到内存中if len(data) == 0:breakprint(data)# 写操作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模式
关于flush , 把缓冲区的数据压入内存 。
flush() 方法是用来刷新缓冲区的 , 即将缓冲区中的数据立刻写入文件 , 同时清空缓冲区 , 不需要是被动的等待输出缓冲区写入 。
一般情况下 , 文件关闭后会自动刷新缓冲区 , 但有时你需要在关闭前刷新它 , 这时就可以使用 flush() 方法 。
用读写流的时候 , 其实数据是先被读到了内存中 , 然后用数据写到文件中 , 当你数据读完的时候不代表你的数据已经写完了 , 因为还有一部分有可能会留在内存这个缓冲区中 。如果此时调用了 close()方法关闭了读写流 , 那么这部分数据就会丢失 , 所以应该在关闭读写流之前先flush() , 先清空数据 。