文件的操作
mode的访问模式
模式 | 描述 |
---|---|
r | 以只读的方式打开文件。文件的指针将会放在文件的开头(默认模式)若文件不存在, 则报错 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从头开始编辑,原有内容会被删除。若文件不存在,则创建该文件 |
a | 打开一个文件用于追加。若该文件存在,新的内容将会被写入到已有内容之后。若不存在,则创建进行写入 |
r+ | 打开一个文件进行读写,指针会放在文件的开头 |
w+ | 打开一个文件进行读写,如果该文件已存在则打开文件,原有内容将被删除,只能先写后读。如果该文件不存在,则创建该文件。 |
a+ | 打开一个文件进行读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
b | 二进制模式 |
file对象常用函数(方法)
函数(方法) | 描述 |
---|---|
file.close() | 关闭文件 |
file.tell() | 返回文件当前位置 |
file.seek(offset,whence) | 移动文件读取指针到指定位置(offset 开始的偏移量,需要移动偏移的字节数;whence 表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起,默认为0) |
file.next() | 返回文件下一行 |
file.read(size) | 从文件中读取指定的字节数,如果未给size值或为负,则读取所有(当前字段) |
file.readline(size) | 读取整行,包括 ‘\n ’ 字符 |
file.readlines(sizeint) | 读取所有行并返回列表,若 sizeint > 0,则是设置一次读多少字节(若第一行5字节,sizeint只有大于5才会读取第二行),这是为了减轻读取压力 |
file.truncate(size) | 截取文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除。必须要有写的操作 |
file.write(str) | 将字符串写入文件,返回的是写入字符串的长度 |
file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则需要自己加入每行的换行符 |
file.isatty() | 如果文件连接到一个终端设备返回True,否则返回False |
file.flush() | 刷新文件内部缓存,直接把内部缓冲区的数据立刻写入文件,而不是被动的等待输出缓冲区写入 |
file.fileno() | 返回一个整型的文件描述符(file descriptor FD 整型),可以用在如os 模块的read() 方法等一些底层操作上 |
文件编码的概念
问:什么是编码?
答:编码就是一种规则集合,记录了内容和二进制间进行相互转化的逻辑
问:计算机只能识别0和1,那么丰富的文本是如何被识别并存储在硬盘中?
答:使用编码技术(密码本)将内容翻译成0和1存入
UTF - 8是目前全球通用的编码格式,除非有特殊需求,否则,一律以UTF-8
格式进行文件编码即可。
ANSI 是windows系统的一个默认编码格式,表示跟随操作系统的语言版本,默认的中文编码是GB2312
文件的读取操作
open()
可以打开一个已经存在的文件、或者创建一个新文件
# 语法
open(file, mode, buffering, encoding)
# file:要打开的目标文件名的字符串(可以包含文件所在的具体路径)
# mode:设置打开文件的模式(访问模式):只读、写入、追加等
# buffering : 若buffering的值为0,则不会有缓存。若buffering的值为1,则访问文件的时候会缓存行。若buffering的值为大于1的整数,表示缓存区的大小。若buffering的值为负,表示缓存区的大小为系统默认。
# encoding:编码格式(推荐使用IUTF-8)
# 示例
file = open('python.txt','r',encoding='UTF-8')
file = open('python.txt','r',1,'UTF-8')
注:此时 file 是 open 函数的文件对象,对象是一种特殊的数据类型,拥有属性和方法可以使用 对象.属性 或 对象.方法 对其进行访问
# file对象函数(方法)连续执行后面的(方法)接着前面的文件指针
f = open('文件路径','r',encoding='UTF-8')
print(f'读取指定字节:{f.read(3)}')
print(f'读取全部内容:{f.read()}')
# for循环读取文件行
for i in f: # 每一个临时变量i,就记录了文件的一行数据
print(i)
# 关闭文件
f.close()
# 若不关闭文件对象,同时程序没有停止运行,那么文件将一直被python程序占用
# 在 with open() 语句块中对文件进行操作,可以在操作完成后自动关闭close文件,避免忘掉close方法
with open('文件路径','r',encoding='UTF-8') as f:
print(f.read(2))
print(f.read())
# 使用函数
# 先标记要统计的单词
def count_word():
count = 0
mark_word = input('请输入你要统计的单词:')
# 打开文件并读取文件,使用for循环与if结合获取结果
with open('文件路径','r',encoding='UTF-8') as file:
lines = file.readlines()
for line in lines:
for word in line.strip().split(' '): # strip去掉前后空格以及换行符
if word == mark_word:
count += 1
print(f'您要统计的单词共出现了{count}次')
count_word() # 调用函数
文件的写入操作
三步骤:
- 1.打开文件
- 2.使用 f.wirte() 写入文件
- 3.内容刷新 f.flush()
直接调用 write()
,内容并未真正写入文件,而是会积攒在内存中,称之为缓冲区,当调用 flush 的时候,或者执行完文件关闭,内容会真正写入文件(close()
内置 flush()
功能),这样做是避免频繁的操作硬盘,导致效率下降
f = open('文件路径', 'w', encoding='UTF-8')
f.write('hello!')
f.flush()
f.close()
文件的追加操作
几乎上同,使用 write()
进行追加,只需要把 mode 模式换成 a 即可
序列化和反序列化
我们可以将字符串直接写入到本地文件,但如果是一个对象(例如 列表、字典、元组等),需要把这个对象序列化才能写入,python中提供了 JSON
模块 用来实现数据的序列化和反序列化,把内存中的数据转换成字节序列,保存到文件,就是序列化,反之,从文件的字节序列恢复到内存中,就是反序列化。
(后续会讲解json
, 这里了解即可)