文件处理流程:python
在 Python 中使用 open()函数打开文件,并返回文件对象:函数
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
open 函数有不少参数,通常地只需了解三个便可。第一个是文件对象,第二个是打开模式,第四个是编码方式。编码
Tips:open 函数打开文件采用的默认编码方式是系统编码,Windows 为 GBK;若打开的文件是 utf-8,那么须要指定编码方式为 utf-8,不然乱码。指针
打开模式 | 说明 |
---|---|
r | 只读方式打开(默认) |
x | 若是文件存在,打开引起异常 |
b | 以二进制方式打开文件 |
+ | 可读写模式(可添加到其余模式中) |
w | 只写方式打开,会覆盖已存在文件 |
a | 以写入模式打开,文件存在,在末尾追加 |
t | 以文本模式打开(默认) |
U | 通用换行符支持 |
使用 open 函数打开一个文件,能够得到文件对象(或句柄),利用文件对象,咱们就能够对文件进行读取或 修改操做:日志
f = open('C:\\Users\\HJ\\Desktop\\a.txt')
Tips:open 函数默认以只读模式打开文本文件,即 rt 模式,打开二进制须要 b 模式。code
打开文件后得到文件对象,利用文件对象的一些方法,咱们能够对文件内容进行读取或修改。视频
文件对象方法 | 说明 |
---|---|
read([n]) | 读取文件(所有读取),以本身为单位读取 |
readable() | 判断文件是否可读,返回布尔值 |
readline() | 一次读取一行,默认换行,f.readline(),end='' 不换行 |
readlines() | 读取全部内容,存成列表 |
write(str) | 将字符串写入文件 |
writeable() | 判断文件是否可写 |
writelines(seq) | 写入一个序列,元素必须是字符串 |
seek(offset,from) | 在文件中移动文件指针 |
tell() | 返回当前在文件中的位置 |
close() | 关闭文件 |
使用 open 函数打开文件,每次都须要关闭文件,非常麻烦。一旦没有关闭,文件就会有泄漏的风险。而 Python 为咱们提供了一个关键字 with,不须要咱们每次本身关闭文件,Python 内部会自动关闭。对象
with open('a.txt') as f: # f 即为文件对象 f.read()
打开一个文件,并将内容写入另外一个文件中:blog
with open('a.txt', 'r', encoding='utf-8') as f1, open('b.txt', 'w', encoding='utf-8') as f2: data = f1.readlines() # 存为列表 f2.write(data[0]) # 只写入第一行
tell()方法图片
read 方法以 字节读取文件,不指定参数,默认所有读取,文件指针指向文件末尾。使用 tell 方法能够查看文件指针位置。
# test_file.txt 第一行 第二行
f = open('test_file', encoding='utf-8', newline='') data = f.readlines() print(f.tell()) print(data) f.close() 22 ['第一行\r\n', '第二行\r\n']
文件默认不显示 \r\n
,每一个汉字 3 个字节,总共 6 个汉字(即 18 个字节)。再加上两个 \r\n
(即 4 个字节),总计 22 个字节,显然文件指针已经指向文件末尾。
Tips:在不一样系统中换行符不一样,Windows 中为
\r\n
,Linux 中为\n
。Python 为了更好地兼容其余平台,统一转换为\n
,要想查看真实的换行符,可在 open 函数中指定newline = ''
默认不显示换行符:
f = open('test_file', encoding='utf-8') print(f.read()) print(f.tell()) 第一行 第二行 22
使用 readlines()
只能看到 \n
:
f = open('test_file', encoding='utf-8') print(f.readlines()) print(f.tell) ['第一行\n', '第二行\n'] 22
seek()方法
文件指针即用来定位光标所在,至关于一个书签,seek()方法能够用来设置文件指针的位置,它的单位也是 字节。
seek(offset, from) seek(3) # 移动 3 个字节
seek()有两个参数:第一个 offset 为偏移量(即偏移字节),第二个 from 表示从哪一个位置开始偏移,from 为三种模式:
从文件开始位置偏移:
f = open('test_file', encoding='utf-8') print(f.tell()) # 文件刚打开时位置为 0 f.seek(10, 0) # 偏移 10 个字节,即第一行 \r 的后面,那么剩下的还要 \n 和 第二行内容 print(f.tell()) print(f.read()) f.close() 0 10 第二行
从当前位置偏移:
f = open('test_file', 'rb') f.seek(3, 0) # 移动 3 个字节 print(f.tell()) # 3 位置 f.seek(3, 1) # 在 3 位置,再移动 3 个字节 print(f.tell()) print(f.read().decode('utf-8')) f.close() 3 6 行 第二行
首先移动 3 个字节,再移动 3 个字节,指针到了第一行内容(第一行)中一的后面,再读取后面的内容。
文件末尾偏移:
f = open('test_file', 'rb') f.seek(-5, 2) print(f.tell()) data = f.readlines() print(data) print(data[-1].decode('utf-8')) f.close() 17 [b'\xe8\xa1\x8c\r\n'] # 二进制,须要解码 行
访问文件的两种方式
设置一个查看日志的程序(查看日志通常都是查看最新的,即文件最后位置的内容)。
方法一:
使用 readlines()方法查看,缺点是须要所有将文件读取出来,加载到内存才能读取最后一行,消耗时间和内存。
f = open('a.txt', encoding='utf-8') data = f.readlines() print(data[-1])
方法二:
利用 seek()方法,将文件指针移动到文件末尾,从文件末尾开始读取。
f = open('a.txt', 'rb') for i in f: offs = -10 while True: f.seek(offs, 2) data = f.readlines() if len(data) > 1: # 大于 1 表示读了两行 print('文件最后一行是:%s' % (data[-1]).decode('utf-8')) break offs *= 2 # 小于 1 表示没有最后一行没有读完,再将偏移量翻倍
写入文件必须是 w 或 a 模式打开文件,只能写入字符串,不能写入其余数据类型。
w 模式打开文件,文件存在则覆盖原有内容,文件不存在则新建。a 模式打开文件,文件追加到文件末尾:
f = open('a.txt', 'w', encoding='utf-8') f.write('123\n') # 要加换行 f.writelines(['45\n', '67\n']) # 写入一个列表
+
表示同时能够对文件进行读写操做。
模式 | 说明 | 模式 | 说明 |
---|---|---|---|
r+ | 读写 | w+ | 读写 |
x+ | 写读 | a+ | 写读 |
b 模式以字节为单位打开文件,便可打开二进制文件(包括视频、图片、音频等),打开时不能指定编码方式。
一个文件在未保存时,它是存在于内存中(字符串形式)。当要存储到硬盘上时,便须要编码成字节码(bytes),同理硬盘上的内容加载处理,须要解码(decode)成字符串(str):
# a.txt 第一行
f = open('test_file', 'rb') data = f.read() print(data) print(data.decode('utf-8')) b'\xe7\xac\xac\xe4\xb8\x80\xe8\xa1\x8c\r\n\r\n' 第一行
wb 、ab模式
以二进制格式写入文件,会覆盖原文件。只能写入二进制文件,所以写入的字符串必须编码成二进制。
f = open('a.txt', 'wb') f.write(bytes('你好\n', encoding='utf-8')) #f.write('你好\n'。encode('utf-8'))
以上两种方式均可以写入文件,ab 末尾则是在末尾追加。
f.closed():判断文件是否关闭 f.encoding:查看文件打开的编码 f.flush():刷新(每过几秒自动保存)从内存到硬盘
open 函数打开文件六种模式r、r+、w、w+、a、a+
的区别: