目录
文件
文件是什么
变量是把数据保存到内存中
.
如果程序重启
/
主机重启
,
内存中的数据就会丢失
.
要想能让数据被持久化存储
,
就可以把数据存储到硬盘中
.
也就是在
文件
中保存
.
在
Windows "
此电脑
"
中
, 看到的内容都是 文件.

通过文件的后缀名
,
可以看到文件的类型
.
常见的文件的类型如下
:
文本文件 (txt)可执行文件 (exe, dll)图片文件 (jpg, gif)视频文件 (mp4, mov)office 文件 (.ppt, docx)......
文件路径
一个机器上
,
会存在很多文件
,
为了让这些文件更方面的被组织
,
往往会使用很多的
"
文件夹
"(
也叫做
目录
)来整理文件.
实际一个文件往往是放在一系列的目录结构之中的
.
为了方便确定一个文件所在的位置
,
使用
文件路径
来进行描述
.
例如
,
上述截图中的
QQ.exe
这个文件
,
描述这个文件的位置
,
就可以使用路径
D:\program\qq\Bin\QQ.exe
来表示
.
D: 表示 盘符 . 不区分大小写 .每一个 \ 表示一级目录 . 当前 QQ.exe 就是放在 "D 盘下的 program 目录下的 qq 目录下的 Bin 目录中" .目录之间的分隔符 , 可以使用 \ 也可以使用 / . 一般在编写代码的时候使用 / 更方便 .
上述以 盘符 开头的路径 , 我们也称为 绝对路径 .除了绝对路径之外 , 还有一种常见的表示方式是 相对路径 . 相对路径需要先指定一个基准目录 , 然后以基准目录为参照点, 间接的找到目标文件 . 咱们课堂上暂时不详细介绍 .描述一个文件的位置 , 使用 绝对路径 和 相对路径 都是可以的 . 对于新手来说 , 使用 绝对路径 更简单更好理解, 也不容易出错 .
文件操作
要使用文件
,
主要是通过文件来保存数据
,
并且在后续把保存的数据读取出来
.
但是要想读写文件
,
需要先
"
打开文件
",
读写完毕之后还要
"
关闭文件
".
1. 打开文件
打开方式 | 含义 |
‘r’ | 以读方式打开文件(默认) |
‘w’ | 以覆盖写方式打开文件,如果文件不存在则先创建再打开 |
‘a’ | 以追加写方式打开文件,如果文件不存在则先创建再打开 |
‘x’ | 创建文件并以写方式打开,如果文件已存在则会抛出异常 |
‘b’ | 以二进制方式打开文件 |
‘t’ | 以文本方式打开文件(默认) |
‘+’ | 打开磁盘文件进行更新(读取与写入) |
打开文件的编码方式
使用内建函数
open
打开一个文件
.
f = open('d:/test.txt', 'r')
第一个参数是一个字符串 , 表示要打开的文件路径第二个参数是一个字符串 , 表示打开方式 . 其中 r 表示按照读方式打开 . w 表示按照写方式打开 . a 表示追加写方式打开.如果打开文件成功 , 返回一个文件对象 . 后续的读写文件操作都是围绕这个文件对象展开 .如果打开文件失败 ( 比如路径指定的文件不存在 ), 就会抛出异常 .

这里的第8189个文件是一个特殊的数字,因为8189 + 3 就是2 的13次方,+ 3 就是有标准输出、标准输入和标准错误三个文件被默认打开
由于这里是将f存入列表fList内,所以不会被python的垃圾回收机制给判定为垃圾被回收掉,而是知道存不下去了就被强制终止
如果去掉fList.appen(f)这一句,python就会用自带的垃圾回收机制,来不断回收f这个文件操作符,从而可以一直将文件进行打开!!!
2. 关闭文件
使用
close
方法关闭已经打开的文件
f.close()
使用完毕的文件要记得及时关闭
!
一个程序能同时打开的文件个数
,
是存在上限的
.
flist = []
count = 0
while True:
f = open('d:/test.txt', 'r')
flist.append(f)
count += 1
print(f'count = {count}')
如上面代码所示 , 如果一直循环的打开文件 , 而不去关闭的话 , 就会出现上述报错 .当一个程序打开的文件个数超过上限 , 就会抛出异常 .注意 : 上述代码中 , 使用一个列表来保存了所有的文件对象 . 如果不进行保存 , 那么 Python 内置的垃圾回收机制, 会在文件对象销毁的时候自动关闭文件 .但是由于垃圾回收操作不一定及时 , 所以我们写代码仍然要考虑手动关闭 , 尽量避免依赖自动关闭
3. 写文件
# 使用write 来实现写文件操作
# 'w' 如果是用写方式打开 就会清空掉原本文件的内容
f = open('d:/pythonWork/test.txt','w')
f.write('h1h\n')
f.close()
# 'a' 追加方式打开
f = open('d:/pythonWork/test.txt','a')
f.write("2222")
f.close()
文件打开之后
,
就可以写文件了
.
写文件 , 要使用写方式打开 , open 第二个参数设为 'w'使用 write 方法写入文件
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
用记事本打开文件 , 即可看到文件修改后的内容 .
如果是使用
'r'
方式打开文件
,
则写入时会抛出异常
f = open('d:/test.txt', 'r')
f.write('hello')
f.close()
使用 'w' 一旦打开文件成功 , 就会清空文件原有的数据 .使用 'a' 实现 " 追加写 ", 此时原有内容不变 , 写入的内容会存在于之前文件内容的末尾
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
f = open('d:/test.txt', 'a')
f.write('world')
f.close()
针对已经关闭的文件对象进行写操作
,
也会抛出异常
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
f.write('world')
4. 读文件
# 1. 使用read 来读取文件内容 只当读几个字符
f = open('d:/pythonWork/test.txt','r',encoding='utf8')
ret = f.read(10)
print(ret)
f.close()
# 2. 更常见的需求是按行来读取
# 最简单的办法就是for循环
f = open('d:/pythonWork/test.txt','r')
for i in f:
print(i,end = "")
f.close()
print("\n")
# 3. 还可以使用readlines 方法直接把整个文件所有内容全部都读出来,按照行组织到一个列表里面
f = open('d:/pythonWork/test.txt','r')
lines = f.readlines()
print(lines) # ['h1h\n', '2222']
f.close()
读文件内容需要使用 'r' 的方式打开文件使用 read 方法完成读操作 . 参数表示 " 读取几个字符 "
f = open('d:/test.txt', 'r')
result = f.read(2)
print(result)
f.close()
如果文件是多行文本
,
可以使用
for
循环一次读取一行
床前明月光
疑是地上霜
举头望明月
低头思故乡
先构造一个多行文件
.
f = open('d:/test.txt', 'r')
for line in f:
print(f'line = {line}')
f.close()
注意 : 由于文件里每一行末尾都自带换行符 , print 打印一行的时候又会默认加上一个换行符 , 因此打印结果看起来之间存在空行.使用 print(f'line = {line}', end='') 手动把 print 自带的换行符去掉
使用
readlines
直接把文件整个内容读取出来
,
返回一个列表
.
每个元素即为一行
f = open('d:/test.txt', 'r')
lines = f.readlines()
print(lines)
f.close()
此处的 \n 即为换行符 .
关于中文的处理
当文件内容存在中文的时候
,
读取文件内容不一定就顺利
.
同样上述代码
,
有的同学执行时可能会出现异常
计算机表示中文的时候
,
会采取一定的编码方式
,
我们称为
"
字符集
"
所谓 " 编码方式 " , 本质上就是使用数字表示汉字 .我们知道 , 计算机只能表示二进制数据 . 要想表示英文字母 , 或者汉字 , 或者其他文字符号 , 就都要通过编码.最简单的字符编码就是 ascii. 使用一个简单的整数就可以表示英文字母和阿拉伯数字 .但是要想表示汉字 , 就需要一个更大的码表 .一般常用的汉字编码方式 , 主要是 GBK 和 UTF-8
必须要保证文件本身的编码方式
,
和
Python
代码中读取文件使用的编码方式匹配
,
才能避免出现上述问题.
Python3 中默认打开文件的字符集跟随系统 , 而 Windows 简体中文版的字符集采用了 GBK, 所以如果文件本身是 GBK 的编码 , 直接就能正确处理 .如果文件本身是其他编码 ( 比如 UTF-8), 那么直接打开就可能出现上述问题
使用记事本打开文本文件
,
在
"
菜单栏
" -> "
文件
" -> "
另存为
"
窗口中
,
可以看到当前文件的编码方式
如果此处的编码为 ANSI , 则表示 GBK 编码 .如果此处为 UTF - 8 , 则表示 UTF-8 编码 .
此时修改打开文件的代码
,
给
open
方法加上
encoding
参数
,
显式的指定为和文本相同的字符集
,
问题即可解决.
f = open ( 'd:/test.txt' , 'r' , encoding = 'utf8' )
PS:
字符编码问题
,
是编程中一类比较常见
,
又比较棘手的问题
.
需要对于字符编码有一定的理解
,
才
能从容应对
. 同学们可以参考腾讯官方账号发表的帖子, 详细介绍了里面的细节.http:// https://zhuanlan.zhihu.com/ p/46216008
使用上下文管理器
打开文件之后
,
是容易忘记关闭的
. Python
提供了
上下文管理器
,
来帮助程序猿自动关闭文件
.
使用 with 语句打开文件 .当 with 内部的代码块执行完毕后 , 就会自动调用关闭方法 .
with open('d:/test.txt', 'r', encoding='utf8') as f:
lines = f.readlines()
print(lines)
# 上下文管理器
# 当with 对应的代码块执行结束,就会自动的执行f的close
def fn() :
with open('d:/pythonWork/test.txt','r') as f:
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
if True:
return
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码
# 这有很多代码