专栏:python
个人主页:HaiFan.
专栏简介:本专栏主要更新一些python的基础知识,也会实现一些小游戏和通讯录,学时管理系统之类的,有兴趣的朋友可以关注一下。
文件操作
- 思维导图
- 前言
- 文件是什么
- 文件路径
- 文件操作
- 打开文件
- 关闭文件
- 写文件
- 读文件
- 上下文管理器
思维导图
前言
像已下载的歌曲,文本文件,图片等,这些数据都是保存在硬盘上的。像我们写的程序中,创建的变量,是在内存中的。
- 内存的空间更小,硬盘空间更大。
- 内存的访问更快,硬盘访问慢
- 内存成本更贵,硬盘成本便宜
- 内存的数据易丢失,硬盘的数据可以持久化存储
文件是什么
变量是把数据保存在内存中,如果程序重启,内存中的数据就会丢失,要是想让数据持久化存储,就可以把数据存储到硬盘中,也就是在文件中保存。
像C盘D盘,这里的内容都是硬盘上的内容,也都是文件。
通过文件的后缀名,可以看到文件的类型。
文本文件txt
可执行文件exe
图片文件jpg
视频文件mp4
office文件ppt
等等
文件路径
一个机器上,会存在很多文件,为了让这些文件更方便的被组织,往往会使用很多的文件夹(目录)来整理文件。
实际一个文件往往是放在一些列的目录结构之中的。
为了方便确定一个文件的所在位置,可以使用文件路径来描述。
如pycharm的路径
D:\python\PyCharm Community Edition 2022.3.1
- D:表示盘符,不区分大小写
- 每一个\表示一级目录
- 目录之间的分隔符,可以使用
\
也可以使用/
以盘符
开头的路径,称为绝对路径
除了绝对路径之外,还有相对路径,相对路径需要先指定一个基准目录,然后以基准目录为参照点,简洁的找到目标文件。
文件操作
要使用文件,主要是通过文件来保存数据,并且在后续把保存的数据读取出来,但是要像读写文件,需要先打开文件,读写完之后还要关闭文件
打开文件
使用内建函数open
打开一个文件
open('d:/FileOperator/python.txt','r')
- 第一个参数 是一个字符串,表示要打开的文件的路径
- 第二个参数是一个字符串,表示打开方式,其中
r(read)
表示按照读方式打开,w(write)
表示按照写方式打开,a(append)
表示追加写方式打开,在原内容的末尾追加。 - 如果打开文件失败,就会抛出异常
- 返回值是文件对象(文件的内容是在硬盘上的,此处的文件对象是内存上的一个变量,后续的读写文件操作,都是拿着这个文件对象来进行操作的)
f = open('d:/FileOperator/python.txt','r')
关闭文件
使用close
方法来关闭已经打开的文件
f.close()
使用完文件一定要记得及时关闭文件。
打开文件,其实是在申请一定的系统资源,不再使用的时候,资源就应该即使释放。
否则就可能会造成文件资源泄露,进一步倒是其他部分的代码无法顺利打开文件了。
正是因为一个系统的资源是有限的,因此一个程序能打开的文件个数,也是有限的。
flist = []
cnt = 0
while True:
f = open('d:/FileOperator/python.txt', 'r')
flist.append(f)
cnt += 1
print(f'cnt = {cnt}')
只打开不关闭,系统资源再多,也有借完的时候。
文件打开了8189次,当然,在系统中,是可以通过一些设置项,来配置打开文件的最大数目。但无论配置的是多少,都应该及时的关闭文件。
每个程序在启动时,都会默认打开三个文件
- 标准输入 键盘 input
- 标准输出 显示器 print
- 标准错误 显示器
写文件
文件打开之后,就可以写文件了。
- 写文件要先打开文件,
open
第二个参数设为w
, - 使用
write
方法写入文件
f = open('d:/FileOperator/python.txt', 'w')
f.write("新年快乐")
f.close()
print(f'文件写入成功')
此时在打开文件。
就可以看到刚刚写入文件的内容.
如果是使用r
方式打开文件,则写入时会抛出异常
f = open('d:/FileOperator/python.txt', 'r')
f.write("新年快乐1")
f.close()
使用w
打开文件成功,就会情况文件原有的数据
使用a
实现追加内容,此时原有的内容不会改变,写入的数据会存在于原有的内容的末尾
现在文件中的内容是
f = open('d:/FileOperator/python.txt', 'w')
f.write("新年快乐,新年快乐")
f.close()
可以看到源文件内容被清空了。
f = open('d:/FileOperator/python.txt', 'a')
f.write("hello world 新年快乐,新年快乐")
f.close()
使用a
方式写入文件,可以看到,是在文件内容末尾追加的数据。
读文件
读文件内容需要使用r
的方式打开文件
使用read
方法完成读操作,参数表示读取几个字符
此时文件里是没有内容的,先读入数据。
f = open('d:/FileOperator/python.txt', 'w')
ch : int = 97
for i in range(0,26):
f.write(chr(i + ch))
f.close()
可以看出,我们往文件里多了了26个字母。
接下来把文件里的内容,输出到屏幕上。
f = open('d:/FileOperator/python.txt', 'r')
fstr = f.read(26)
print(fstr)
如果文本是多行,可以用for
循环一次读取一行。
把数据写到文件里面。
f = open('d:/FileOperator/python.txt', 'r')
fstr = f.read(2)
print(fstr)
当文件中的内容存在中文的时候,读取文件内容不一定顺利。
所谓编码方式,本质上就是使用数字表示汉字,我们知道,计算机只能表示二进制数据,要想表示英文字母,或者汉字,或者其他的符号,都要通过编码,最简单的字符编码就是ascii,使用一个简单的整数就可以表示英文字母和阿拉伯数字,但是要想表示汉字,就需要一个更大的码表,一般常用的汉字编码方式主要是:GBK和UTF-8
必须要保证文章本身的编码方式和python代码中读取文件使用的编码方式匹配,才能避免出现上述问题。
Python3 中默认打开文件的字符集跟随系统, 而Windows 简体中文版的字符集采用了 GBK, 所以如果文件本身是 GBK 的编码, 直接就能正确处理.如果文件本身是其他编码(比如 UTF-8), 那么直接打开就可能出现上述问题。
点击记事本,点击文件,点击另存为,在窗口中可以看到当前文件的编码方式。
如果此处的编码为ANSI
,则表示GBK
编码
如果此处为UTF-8
,则表示UTF-8
编码。
此时修改打开文件的代码,给open
方法加上encoding
参数,显示的指定为和文本相同的字符集,问题即可解决
f = open('d:/FileOperator/python.txt', 'r',encoding = 'UTF-8')
fstr = f.read(2)
print(fstr)
此时就会显示文件中的内容。
f = open('d:/FileOperator/python.txt', 'r',encoding = 'UTF-8')
for line in f:
print(line)
f.close()
这里为什么会有换行呢?
因为print自带换行,并且文件行末也自带换行,所以会多出一个换行。
可以给print在设定个参数,修改print自动添加换行的行为。
f = open('d:/FileOperator/python.txt', 'r',encoding = 'UTF-8')
for line in f:
print(line,end='')
f.close()
end参数表示每次打印之后要在末尾加个什么,默认是换行
使用readlines
直接把整个文件内容读取出来,返回一个列表,每个元素即为一行
f = open('d:/FileOperator/python.txt', 'r',encoding = 'UTF-8')
print(f.readlines())
f.close()
\n就是换行符
上下文管理器
打开文件之后,容易忘记关闭文件,Python’中提供了上下文管理器,来帮助程序猿自动关闭文件。
- 使用
with
语句打开文件 - 当
with
内部的代码执行完毕之后,就会自动调用关闭的方法
def function():
f = open('D:/FileOperator/python.txt','r',encoding='UTF-8')
#代码
#代码
#代码
#代码
#代码
#代码
#代码
当你做一些项目的时候,一个函数中,代码过的多的话,可能会忘记写关闭文件的操作。
def function():
with open('D:/FileOperator/python.txt','w',encoding='UTF-8') as f:
#进行一些与文件有关的代码
f.write("好好学习")
if True:
return
with open('D:/FileOperator/python.txt','w',encoding='UTF-8') as f:
这里是with语句里
f
的效果与
f = open('d:/FileOperator/python.txt', 'r',encoding = 'UTF-8')里的
f`的效果是一样的。
最后有一个:
代表着又是一个代码块。当with所对应的代码块结束的时候,就会自动执行关闭文件的操作。