欢迎您进入老吴的博客,如有联系请加我QQ:2367214814
7.1 初识文件操作:
大家应该听说过一句话:“好记性不如烂笔头”。
不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,“哭都没地方哭了”可见,在把数据存储起来有做么大的价值。
7.1.1 常见的文件
7.1.2 文件的作用
就是把一些数据存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
7.2文件的打开与关闭
想一想:
如果想用word编写一份简历,应该有哪些流程呢?
1、打开word软件,新建一个word文件
2、写入个人简历信息
3、保存文件
4、关闭word软件
同样,在操作文件的整体过程与使用word编写一份简历的过程是很相似的
1、打开文件,或者新建立一个文件
2、读/写数据
3、关闭文件
7.2.1 写文件:
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件
# 相对路径-写入文件
open(文件名,访问模式) ; open里面有两个参数。
示例如下:
先创建一个test.py文件,利用Python代码打开这个文件。
f = open('test.txt', 'w') open有返回值 找个变量接收 。
# 找个变量保存open的返回值,任何操作通过f操作; "w"--》写文件; ‘rrrrrrrrrr'-》只能读
f.write("hello,大家好")
f.close() # 关闭文件
错误分析:当我们打开一个文件,可是中文出现乱码,这是可能因为我们文件使用UTF-8进行编辑,而Windows默认使用GBK编码格式,所以导致打开文件时出现乱码
解决方法一:在打开的文本中解决(治标不治本)。点击图中右下角的UTF-8,选择GBK,在弹出的窗口中选择Reload(重载)
解决方法二:在编辑文本时,设置指定的编码格式。
查看结果:
访问模式 |
说明 |
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。如果文件不存在会崩溃。文件必须存在 |
w |
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ |
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
用编辑器编辑的文件是文本文件;图片、视频、MP3等是二进制文件
7.2.2 读文件
相对路径文件:
相对路径就是在同一个文件夹下面。建议工作把文件写在相对路径下面
此时你需要先利用软件创建一个文件,文件里面随便写一些内容,然后保存在任意磁盘(路径尽量要简单一些)中。
然后创建一个py文件,利用Python代码打开这个文件。
读取test1文件示例如下:
# 相对路径-读取文件
f=open('test1.txt','r',encoding='utf-8')
data = f.read()
print(data)
# close作用有时候会立马进去 有时间在内容里面 为了防止数据遗落
f.close( )
7.2.3 在本地磁盘读取文件:
1. 在本地D盘新建一个 吴sir.txt 文件。
在电脑用户创建txt文件时,默认的都是“ANSI”编码格式。如果需要创建完以后查看。
打开txt文件以后继续点击界面工具栏中的“文件”功能。
另存为:
1.首先电脑用户打开需要修改编码方式的“TXT”文件。
2.打开txt文件以后继续点击界面工具栏中的“文件”功能。
3.点击“文件”显示下拉菜单以后。点击下拉菜单中的“另存为”选项。
4.进入“另存为”操作界面以后。在下方的编码设置中设置自己需要的编码方式。
5.设置好txt文件编码方式以后点击保存即可完成修改。
绝对路径文件:
参考代码:
# 用什么编码写的文件 就用什么编码打开文件
# 字符编码在控制面板设置
# 绝对路径:
# 绝对路径定义:从盘符开始的路径,这是一个完整的路径。
f = open(r"D:我是吴sir.txt",mode='r',encoding='utf-8')
# f = open(r"D:我是吴sir.txt",mode='rb')
content = f.read()
print(content)
f.close()
7.3写文件扩展:
结果:
# 写文件 ,没有则会创建文件, 有文件把源文件删除在写
#f = open(r"D:我是吴sir.txt",mode='wb',encoding='utf-8') # 执行会报错
f = open(r"Wusir.txt",mode='wb')#不用加这个,encoding='utf-8',因为是二进制形式 不用编码了 是byte类型
f.write("技术改变命运".encode('utf-8')) #wb 是bytes类型 把str 转换成bytes类型 用encode
f.close()
追加:
结果:
# 追加 a
f = open("Wusir.txt",mode='a',encoding='utf-8')
f.write('匠心精神')
f.close()
7.3.1 只读文件:
参考代码:
# 只读
f = open("Wusir.txt",mode='r+',encoding='utf-8')
content = f.read()
f.write('不用r+则会报错')
f.close()
# 报错原因因为r是只读的
# r+ 模式
# 读写功能 #读完文件后追加了内容
7.4 文件操作之seek()函数
扩展:seek()函数是Python中操作文件游标移动操作的函数
seek() 方法用于移动文件读取指针到指定位置。
作用:用来移动文件指针
语法如下:
文件对象.seek(偏移量,起始位置)
起始位置假设偏移了5 ,也就是说从开头数出来5个我们不读取我们从第六个开始读取
起始位置:
0:文件开头
1:当前位置
2:文件结尾
注意:
“人生苦短”用gbk存是2个字节一个字,用utf-8就是3个字节。
因此以gbk打开时,seek(4) 就把光标切换到了“生”苦。两个字中间。
但如果是utf8,seek(4)会导致,拿到了生这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了,因为编码对不上了。少了一个字节。
参考代码:
#想知道光标在哪?
f = open("Wusir.txt",mode='r+',encoding='utf-8')
# 中文:一个中文用三个字节表示,所以出错
# 一个字节等于三个字符
f.seek(3) #seek 是按照字节去定光标的位置 # 英文:一个字母用一个字节表示,所以不会有错误
print(f.tell()) # 告诉你光标的位置
content= f.read()
print(content)
f.close()
总结:
# 英文:一个字母用一个字节表示
# 中文:一个中文用三个字节表示
7.4.1 读数据的区别
read() : 一次性读取整个文件内容。 read()读取的时候指定读取到什么位置
在r模式下,n按照字符读取。
readline():读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个 内存不够时使用,一般不太用
readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。
就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素
Wusir.txt文件内容写入:
世界已不同,不必再打扰
旅行的意义
清欢
伤心的云
回家的路
忍一忍抗一抗,拼一拼
f = open('Wusir.txt',mode='r',encoding='utf-8')
msg = f.read(3)
msg1 = f.read()
f.close()
print(msg)
print(msg1)
结果:
readline()
readline()读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个
f = open('Wusir.txt',mode='r',encoding='utf-8')
msg1 = f.readline()
msg2 = f.readline()
msg3 = f.readline()
f.close()
print(msg1)
print(msg2)
print(msg3)
解决这个问题只需要在我们读取出来的文件后边加一个strip()就OK了
结果:
readlines()
readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。
f = open('Wusir.txt',mode='r',encoding='utf-8')
print(f.readlines())
f.close()
7.4.2 打开文件的另一种方式
咱们打开文件都是通过open去打开一个文件,其实Python也给咱们提供了另一种方式:with open() as .... 的形式,那么这种形式有什么好处呢?
写入文件:
with open('Wusir.txt',mode='w',encoding='utf-8') as f1:
f1.write("人生苦短,我用Python")
结果:
读取文件:
with open('Wusir.txt',mode='r',encoding='utf-8') as f1:
# f1.write("人生苦短,我用Python")
print(f1.read())