(1)、读文件的步骤:
(1)打开文件
open(path,flag,encoding,[errors])
path:打开路径
flag:打开方式 r(只读) rb(二进制格式) r+(可以读写)
w(只写,存在覆盖,不存在创建) wb(写入二进制) w+(用于读写)
a(文件存在,追加) a+()
encoding:编码方式
errors:错误处理
(2)读取文件
(3)关闭文件
(2)读取文件的几种方法
# 第二步:读取文件内容 的四个方法 #1:方法1-读取文件的全部内容[只适合读取小的文件,不然费内存] str1=f.read() print(str1) # 2 方法2-读取指定字符数 str2=f.read(10) print(str2) str3=f.read(2) print(str3) ''' 输出: def proces sF 总结:文件不关闭的情况下,读完一次,指针在最后边,继续读2个字符信息。 ''' # 3 方法3-每次读取一行数据,包括‘ ’ # str4=f.readline() str4=f.readline(10) #表示读取一行的10个字符 print(str4) # 4 方法4-读取方式4 读取所有行并返回列表 list7=f.readlines() list7=f.readlines(22) #每行读取这么多 print(list7)
(3)关闭文件
# 第三步:关闭文件 f.close()
【总结】:完整的两种读文件方式
方法1:
try: f1=open(path,'r',encoding='utf8',errors='ignore') print(f1.read()) except: print("文件读取出错!") finally: if f1: f1.close()
方法2:带with的自动关闭文件的方式
# 方法2 with 自动关闭文件 path=r'E:[AAA]全栈学习pythonday2file1.txt' try: with open(path) as file_obj: content=file_obj.read() print(content) except: print("读取失败!")
一、原生态三步法写入文件
# 文件写入 # 第一步:打开文件 path=r"E:[AAA]全栈学习pythonday2file2.txt" f=open(path,'w') # 第二步:写文件 #1 这里其实只是先写入了缓冲区,但是还没得奥文件中去,需要刷新 f.write("jiajia is a beautiful girl333 !") # 2 刷新缓冲区,就是立即写入文件,不写刷新就是关闭才能写入文件 f.flush() # 第三步:关闭文件 f.close()
说明: flush()是及时就写入到文件中去,没有这个flush的话 只会等到文件关闭的时候才会被写入到文件。
【注意】:还有就是在写入时候遇到' ' 或者是缓冲区满了也会自动刷新
案例2:用带with自动关闭文件且追加的方式写入
# 案例2:用带with自动关闭文件且追加的方式写入 with open(path,'a') as file_obj: file_obj.write("康忙北鼻是一个帅哥!")
# file_obj.flush() #这种方式是不需要刷新与关闭操作的。
案例3
# 1 普通写入一个文件信息 path=r'E:[AAA]全栈学习pythonday3file1.txt' with open(path,'w') as f1: str="I love programming" str2="I also like write articles" f1.write(str) f1.write(str2) ''' 输出: 发现两个写入的文件信息都在一行显示了。 I love programmingI also like write articles 解决办法: 在每个str 中加上换行符即可! ''' # 2每添加一段信息 ,带换行信息写入如何做呢! path2=r'E:[AAA]全栈学习pythonday3file2.txt' with open(path,'w') as f1: str="I love programming " str2="I also like write articles " f1.write(str) f1.write(str2) ''' 输出 I love programming I also like write articles ''' # 3 附加到文件file2 with open(path2,'a') as file_obj: file_obj.write("i am the first one! ") file_obj.write("I AM THE SECOND ONE! ") ''' 输出: i am the first one! I AM THE SECOND ONE! '''
二、二进制文件的写入
案例1
# 存入和读取二进制文件信息 path = r'E:[AAA]全栈学习pythonday3file3.txt' with open(path,'wb') as f1: str_bytes='I am jiyongjia !'.encode('utf-8') f1.write(str_bytes) with open(path,'rb') as f2: str2=f2.read() print(str2) print(type(str2)) ''' 输出、 b'I am jiyongjia !' <class 'bytes'> 我们发现读取的并不是字符串,所以并不好处理 '''
总结:我们发现读取的并不是字符串,所以并不好处理
案例2:处理以上案例,让读取出的信息是一个str 方便处理
# 读取 with open(path,'rb') as f2: str2=f2.read() print(str2.decode('utf-8')) print(type(str2.decode('utf-8'))) ''' 输出: I am jiyongjia ! <class 'str'> 这里就是提取的字符串了; '''
所以,有时候我们需要把读取到的数据进行解码才行!
关于二进制的读写总结
# 总结:
如果是按照二进制打开文件的,要写入或者读取一定要编码 解码。
# 对于二进制的读与写,要进行对应结构的编码与解码,编码和解码用相同的方式才行。中文也可以解析出。
# 写的时候:str_bytes='I am jiyongjia嘉 !'.encode('utf-8')
# 读的时候:str2=f2.read().decode('utf-8')
'''
如果不进行decode解码输出的话会是:b'I am jiyongjiaxe5x98x89 !' 它是一个 <class 'bytes'> 非字符串,不好操作、
如果使用了decode 解码再输出的话,输出结果是一个I am jiyongjia嘉 ! 它是一个 <class 'str'>
'''
方法一:使用pickle库 来进行读写
import pickle #引入数据持久性模板 # 1--使用 pickle 方式写入进去。 mylist = [1,2,3,4,5,6,"jiajia","我是雷锋"] # 把这个list写入文件4 path = r'E:[AAA]全栈学习pythonday3file4.txt' f= open(path,'wb') #打开 pickle.dump(mylist,f) f.close() #关闭 # 读取出来、 f2= open(path,'rb') #打开 templist=pickle.load(f2) print(templist) f2.close() #关闭 ''' 输出: [1, 2, 3, 4, 5, 6, 'jiajia', '我是雷锋'] '''
方法二:使用json库 来进行读写
说明:
json 文件 非常有用,因为我们往往需要在关闭程序前把程序所处理得到的数据进行保存,在下一次打开程序的时候再加载这些数据,这就要用到json。而且 json 数据是一种通用格式,通过json 就可以把数据打包分享给其他语言的程序员使用了,便于跨平台操作。
# 说明: # json 文件 非常有用,因为我们往往需要在关闭程序前把程序所处理得到的数据进行保存, # 在下一次打开程序的时候再加载这些数据,这就要用到json。而且 json 数据是一种通用格式, # 通过json 就可以把数据打包分享给其他语言的程序员使用了,便于跨平台操作。 import json # 1 把列表存入到json 文件 即json.dump list1=[1,12,3,4,5,6,"嘉嘉","jiajai"] dict1={"1":"puyhon学习",'2':"Java学习"} path= r'E:[AAA]全栈学习pythonday3jsonfile1.json' with open(path,'w') as json_file: json.dump(list1, json_file) # 2 把json文件中的内容取出 即json.load path= r'E:[AAA]全栈学习pythonday3jsonfile1.json' with open(path) as f2: file=json.load(f2) print("welcome back! 提取内容是:",file)