欢迎来到十九分快乐的博客

生死看淡,不服就干。

7.文件的基本操作

文件的基本操作

1.文件的打开模式

w   write 写入模式:只能写入字符串和字节流      
	文件不存在则创建文件,存在的话则打开清空内容,并且将文件指针放在文件的开头
r   read  读取模式
	文件不存在则报错! 存在的话则打开文件,并且将文件指针放在文件的开头
a   append 追加模式
	文件不存在则创建文件,存在的话则打开文件,并且将文件指针放在文件的末尾
x   xor 异或模式(基本不用)
	文件已存在则报错! 不存在的话则创建文件,将文件指针放在文件的开头
#扩展模式 (配合打开模式的辅助模式,自己单独不能使用)
    +   plus   增强模式(可以让文件具有读写功能)       
    b   bytes  bytes模式(二进制字节流)    
#模式一共16种
    w,w+,wb,wb+
    r,r+,rb,rb+
    a,a+,ab,ab+
    x,x+,xb,xb+      

2.文件的写入读取操作

格式:
    fp = open(文件名,模式,字符编码)#打开文件
    fp.read()	#读取文件
    fp.write()	#写入文件
    fp.close()	#关闭文件
# 一.文件的写入操作
fp = open("lianxi.txt",mode="w",encoding="utf-8") 
fp.write("把大象塞进去") 
fp.close() 
# 二.文件的读取操作
fp = open("lianxi.txt",mode="r",encoding="utf-8")
res = fp.read()
print(res)
fp.close()    

3.字节流

字节流语法格式(前面加b) : b"123"
二进制字节流的应用场景: 在数据传输或者在数据存储时,使用的一种数据格式;
多个字符放在一起叫做字符串,多个字节放在一起叫做字节流
# 1.将字符串和字节流(Bytes流)类型进行转换 (参数写成转化的字符编码格式)
	"""
	encode() 编码  将字符串转化为字节流(Bytes流)
	decode() 解码  将Bytes流转化为字符串
	"""
    strvar = b"123"
    print(strvar , type(strvar)) # b'123' <class 'bytes'>
# 2. 中文不能在字符串前面加b,必须是ascii编码才能加:
	#办法: 把中文变成字节流
	# encode 编码
    strvar = "我爱你".encode("utf-8")
    print(strvar)
	# decode 解码
    res = strvar.decode("utf-8")
    print(res)
# 3.写入字节流
	"""mode = wb 代表写入的是字节流 , 不要指定任何编码集 """
    fp = open("lianxi2",mode="wb")
    strvar = "爱上一匹野马,家里没有草原"
    fp.write(strvar.encode())#将字符串转化成字节流,默认utf-8编码
    fp.close()
# 4.读取字节流
	"""mode = rb 代表读取的是字节流 , 不要指定任何编码集 """
    fp = open("lianxi2",mode="rb")
    res = fp.read()
    fp.close()
    print(res)	#读取的都是二进制字节流
    print(res.decode())	#解码字节流
# 5.复制图片:先读取字节流,再写入另一个文件中
	# 打开原文件,读取其中的字节流
    fp = open("集合.png",mode="rb")
    res = fp.read()
    fp.close()
    print(res)
	# 把这些字节流写入到另外文件中
    fp = open("集合2.gif",mode="wb")
    fp.write(res)
    fp.close()

4.文件的扩展模式

"""
utf-8编码格式下,默认一个中文三个字节,一个英文或字符占用一个字节
read() :读取光标右边字符(参数)
         参数:根据文件打开模式而产生变化,如果带有b字节流模式,读取的是字节的个数,否则读取的是字符的个数
seek() :调整指针的位置(里面的参数代表字节个数)
		seek(0) 把光标移动到文件开头
        seek(0,2)把光标移动到文件末尾            
tell() :当前光标左侧的所有字节数
"""
# with ...as 语法,可以省略掉close操作
# 1.r+先读后写
with open("1.txt",mode="r+",encoding="utf-8") as fp:
    res=fp.read(2)   #先读,读完光标跑到文件末尾
    print(res)
    res=fp.tell()	#计算文件字节数
    print(res)
    fp.write("abc")	#写入内容,光标跑到文件末尾
    fp.seek(0)  #再读需要调整光标位置
    res=fp.read()
    print(res)
# 2.a+和r+两个模式的区别
    """
    a+模式下:写入内容时,会强制把光标移动到文件的末尾(seek()移动光标位置也不行)
    r+模式下:写入内容时,会随着光标的位置改变而替换光标右边的字符
    """
# 3.刷新缓冲区:flush
    """
    当文件关闭的时候自动刷新缓冲区;
    当整个程序运行结束时自动刷新缓冲区;
    当缓冲区写满时,会自动刷新缓冲区;
    手动刷新缓冲区:flush
    """    

5.文件相关函数

# 1.readable()    判断文件对象是否可读
# 2.writable()    判断文件是否可写
with open("1.txt",mode="r",encoding="utf-8")as fp:
    res=fp.readable()	#返回True
    print(res)
    res=fp.writable()	#返回False
    print(res)
# fp对象本身可以遍历(迭代器)
	"""遍历时,按照一行一行读取所有内容"""    
# 3.readline() 	读取一行文件内容
	# (1)读取读取文件所有行的数据:
with open("1.txt",mode="r",encoding="utf-8")as fp:
    res=fp.readline()
    while res:
        print(res)
        res=fp.readline()    
	# (2)readline(n) 读取一行中n个字符个数 
# 4.readlines() :将文件中的内容按照换行读取到列表当中
with open("1.txt",mode="r",encoding="utf-8")as fp:
    lst=fp.readlines()
    print(lst) 	 #列表的字符串中有没用的符号
    lstnew=[]		#创建新列表
    for i in lst:	#遍历文件列表
        res=i.strip()   	#去除杂质
        lstnew.append(res)	#追加到新列表中
    print(lstnew)
# 5.writelines() 将元素是字符串的可迭代性数据写入文件中 
lst=["11111","22222","33333","44444"]
with open("2.txt",mode="w+",encoding="utf-8")as fp:
    fp.writelines(lst)  
    fp.seek(0)
    res=fp.read()   #写入的内容是连在一起的
    print(res)
    # 要使写入的内容各行显示,可以先在原字符串后加上换行符(\n)
    
# 6.truncate() 将截取的字符串提取出来,然后清空内容,将提取的字符串重新写入文件中
	'''参数是数字,截取的是字节'''
posted @ 2020-12-01 22:54  十九分快乐  阅读(96)  评论(0编辑  收藏  举报