🍃引言
手把手带你快速上手Python
Python基础专栏
一、🍃文件是什么
变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失。
要想能让数据被持久化存储, 就可以把数据存储到硬盘中. 也就是在文件中保存。
通过文件的后缀名, 可以看到文件的类型. 常见的文件的类型如下:
- 文本文件 (txt)
- 可执行文件 (exe, dll)
- 图片文件 (jpg, gif)
- 视频文件 (mp4, mov)
- office 文件 (.ppt, docx)
- 文件夹(目录),也是一种特殊的文件,目录文件
- ......
即使都是文件,文件里面存储数据的内容/格式,也是差异很大的。
下面围绕着文本文件来展开
二、🍃文件路径
一个机器上, 会存在很多文件, 为了让这些文件更方面的被组织, 往往会使用很多的 "文件夹"(也叫做目录) 来整理文件.
实际一个文件往往是放在一系列的目录结构之中的.
为了方便确定一个文件所在的位置, 使用文件路径来进行描述.
一段路径:C:\Users\lenovo\source\repos
- D: 表示 盘符. 不区分大小写。
- 每一个 \ 表示一级目录. 当前 repos 就是放在 "C 盘下的 Users 目录下的 lenovo 目录下的 source 目录中" 。
- 目录之间的分隔符, 可以使用 \ 也可以使用 /. 一般在编写代码的时候使用 / 更方便(因为\ 在字符串里有特定的含义:可以表示“转义字符”,\\在字符串中表示一个\ )。
上述以盘符开头的路径, 我们也称为绝对路径。除了绝对路径之外, 还有一种常见的表示方式是相对路径。相对路径需要先指定一个基准目录, 然后以基准目录为参照点, 间接的找到目标文件。描述一个文件的位置, 使用绝对路径和相对路径都是可以的.
三、🍃文件操作
要使用文件, 主要是通过文件来保存数据, 并且在后续把保存的数据读取出来.
但是要想读写文件, 需要先 "打开文件", 读写完毕之后还要 "关闭文件".
1. 打开文件
使用内建函数 open 打开一个文件。
f = open('e:/python/test.txt','r')
第一个参数是一个字符串, 表示要打开的文件路径
第二个参数是一个字符串, 表示打开方式。其中‘r’是打开方式:
- r 表示read,以读的方式打开
- w 表示 write,以写的方式打开
- a 表示 append,也是以写的方式打开,把内容写到原有文件内容的末尾
- ......
如果打开文件成功, 返回一个文件对象。后续的读写文件操作都是围绕这个文件对象展开。
当文件不存在的时候,尝试按照读的方式打开,会抛出异常:文件没有找到
理解一下这里的 f
f 是open的返回值,是一个文件对象
文件的内容是在硬盘上的
此处的文件对象是在内存上的一个变量
后续的读写操作都是拿着这个文件对象来进行操作。
此处的文件对象就像是一个‘遥控器’一样
计算机中,也把这样的远程‘遥控器’称之为‘句柄’(handler)
f = open('e:/python/test.txt','r')
print(type(f))
print(f)
2. 关闭文件
使用 close 方法关闭已经打开的文件。
f.close()
注意:使用完毕的文件要记得及时关闭
一个程序能同时打开的文件个数, 是存在上限的。否则就会造成文件泄露,进一步导致其他部分的代码无法顺利打开文件了。
flist = []
count = 0
while True:
f = open('e:/python/test.txt', 'r')
flist.append(f)
count += 1
print(f'count = {count}')
如上面代码所示, 如果一直循环的打开文件, 而不去关闭的话, 就会出现上述报错.
当一个程序打开的文件个数超过上限, 就会抛出异常.
注意: 上述代码中, 使用一个列表来保存了所有的文件对象.
如果不进行保存, 那么 Python 内置的垃圾回收机制, 会在文件对象销毁的时候自动关闭文件.
但是由于垃圾回收操作不一定及时, 所以我们写代码仍然要考虑手动关闭, 尽量避免依赖自动关闭.
在系统中,可以通过一些设置项,来配置打开文件的最大数目。
8189 + 3 = 8192 =》8192是2的13次方
计算机里的很多数据都是按照 2的多少次方来表示的
解释一下 3 是怎么来的
每个程序在启动的时候,都会默认打开3个文件
1.标准输入 ------ >键盘
2.标准输出 ------ > 显示器
3.标准错误 ------ > 显示器
3.写文件
文件打开之后, 就可以写文件了.
- 写文件, 要使用写方式打开,open 第二个参数设为 'w'
- 使用 write 方法写入文件.
f = open('e:/python/test.txt','w')
f.write('hello')
f.close()
用记事本打开文件, 即可看到文件修改后的内容.
- 如果是使用 'r' 方式打开文件, 则写入时会抛出异常.
f = open('e:/python/test.txt','r')
f.write('hello')
f.close()
- 使用 'w' 一旦打开文件成功, 就会清空文件原有的数据。
- 使用 'a' 实现 "追加写", 此时原有内容不变, 写入的内容会存在于之前文件内容的末尾。
f = open('e:/python/test.txt','w')
f.write('hello')
f.close()
f = open('e:/python/test.txt','a')
f.write(' word')
f.close()
- 针对已经关闭的文件对象进行写操作, 会抛出异常.
4. 读文件
- 读文件内容需要使用 'r' 的方式打开文件
- 使用 read 方法完成读操作. 参数表示 "读取几个字符"
f = open('e:/python/test.txt','r')
result = f.read(2)
print(result)
f.close()
在文件中存储一段诗:
打印时可能会出现乱码或者抛出异常:
这是因为两者的编码不一致
代码中是尝试按照 gbk 来解析的,文件是UTF-8编码,所以可以让代码按照UTF-8 来进行解析
使用关键字传参:
f = open('e:/python/test.txt','r',encoding = 'UTF8')
result = f.read(2)
print(result)
f.close()
如果文件是多行文本, 可以使用 for 循环一次读取一行.
f = open('e:/python/test.txt','r',encoding = 'UTF8')
for line in f:
print(f'line = {line}')
f.close()
注意: 由于文件里每一行末尾都自带换行符, print 打印一行的时候又会默认加上一个换行符, 因此打印结果看起来之间存在空行.
使用 print(f'line = {line}', end='') 手动把 print 自带的换行符去掉.
f = open('e:/python/test.txt','r',encoding = 'UTF8')
for line in f:
print(f'line = {line}', end = '')
f.close()
使用 readlines 直接把文件整个内容读取出来, 返回一个列表. 每个元素即为一行
f = open('e:/python/test.txt','r',encoding = 'UTF8')
lines = f.readlines()
print(lines)
f.close()
此处的 \n 即为换行符.
四、🍃使用上下文管理器
打开文件之后, 是容易忘记关闭的. Python 提供了上下文管理器 , 来帮助程序员自动关闭文件.
- 使用 with 语句打开文件.
- 当 with 内部的代码块执行完毕后, 就会自动调用关闭方法.
with open('e:/python/test.txt','r',encoding = 'UTF8') as f:
lines = f.readlines()
print(lines)