# 文件编码

编码:一种规则集合,记录了内容和二进制间进行相互转换的逻辑

计算机中有许多可用编码,例如:

  • 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_objopen 函数的文件对象(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()

参考:黑马程序员