# 文件编码
编码:一种规则集合,记录了内容和二进制间进行相互转换的逻辑
计算机中有许多可用编码,例如:
- UTF-8
- GBK
- Big5
UTF-8 是目前全球通用的编码格式
除非有特殊需求,否则,一律以 UTF-8 格式进行文件编码即可
# 文件的读取
# 访问模式
常用的三种基础访问模式:
'r'
:以 只读 方式打开文件(默认模式)。文件的指针将会放在文件的开头'w'
:打开文件只用于 写入 。如果该文件已存在,则打开文件,并从开头开始编辑(原有内容会被删除);如果该文件不存在,创建新文件'a'
:打开一个文件用于 追加 。如果该文件已存在,新的内容将会被写入到已有内容之后;如果该文件不存在,创建新文件进行写入
# 打开文件
使用 open
函数可以打开一个已经存在的文件,或者创建一个新文件(使用 'w'
模式时)
open(name, mode, encoding) |
其中:
- name:字符串,表示目标文件的文件名(可以包含文件所在的路径)
- mode:设置打开文件的模式(访问模式):只读、写入、追加等
- encoding:编码格式(推荐使用 UTF-8)
操作文件需要通过 open
函数打开文件得到文件对象
例如:
# encoding 不是第三个位置参数,需要采用关键字传参 | |
file_obj = open('python.txt', 'r', encoding='UTF-8') |
注意:此时的 file_obj
是 open
函数的文件对象(Python 中一种特殊的数据类型),拥有属性和方法,可以使用 对象.属性
或 对象.方法
对其进行访问
# 关闭文件
close
关闭文件对象,即,关闭对文件的占用
file_obj.close() |
如果不调用 close
,并且程序没有停止运行,那么这个文件将一直被 Python 程序占用(除 with open
语法外)
# 读操作
# read 方法
read
可以读取给定长度的数据
file_obj.read(num) |
其中,num 表示要从文件中读取的数据的长度(字节数)。如果没有传入 num,表示读取文件中所有的数据
# readlines 方法
readlines
可以一次性读取整个文件中的内容。 readlines
返回的是一个列表,其中,文件每一行的数据对应列表的一个元素
file_obj.readlines() |
# readline 方法
readline
一次读取一行数据
file_obj.readline() |
# for 循环读取文件行
可以使用 for
循环遍历读取文件的每一行内容
# 临时变量 line 记录文件的一行数据 | |
for line in open(name, mode, encoding): | |
print(line) |
# with open 语法
通过在 with open
的语句块中对文件进行操作,可以在操作完成后自动关闭文件,避免因忘记 close
文件对象而导致文件被占用
with open(name, mode, encoding) as file_obj: | |
file_obj.readlines() |
# 文件的写入
# 打开文件
file_obj = open(name, mode='w', encoding='UTF-8') |
使用 'w'
模式时:
- 如果文件不存在,会创建新文件
- 如果文件存在,会将原有内容清空
# 写操作
file_obj.write(content) |
content
表示需要写入的内容
注意:调用 write
时,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
当调用 flush
时,内容会真正写入文件
file_obj.flush() |
write
写入内容 +flush
刷新内容到硬盘,这样做是避免因频繁操作硬盘而导致效率下降
# 关闭文件
file_obj.close() |
注意: close
方法内置了 flush
的功能
# 文件的追加写入
# 打开文件
file_obj = open(name, 'a', encoding='UTF-8') |
使用 'a' 模式时:
- 如果文件不存在,会创建文件
- 如果文件存在,会在文件最后追加写入
# 追加写入操作
# 写入内容 content | |
file_obj.write(content) | |
# 刷新内容 | |
file_obj.flush() |
# 关闭文件
file_obj.close() |
参考:黑马程序员