Python不需要导入外部库来读、写文件和其它操作,在python中提供了open内置函数来读、写文件.....
1.准备工作:
1.1 新建一个文件(右击->New->File->口是心非.txt)
1.2 新建File_Text.py脚本
2.文件操作流程:
2.1 打开文件,赋值给一个变量并得到文件句柄 (变量/句柄 = open('文件名', '模式', encoding='解码方式'))
2.2 通过句柄对文件进行操作 (句柄.方法())
2.3 关闭文件 (句柄.close())
三种原生模式(默认为文本模式)
打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】注:
文件修改机制:文件内容都是以二进制形式存到硬盘当中,如果想把新的数据存到硬盘中,只能覆盖硬盘原有的数据
读操作('r')
func = open('口是心非.txt', 'r',encoding='utf-8') #相对路径
# 读取所有内容,光标移动到文件末尾
data = func.read()
# 打印文件内容
print(data)
# 文件是否可读
print(func.readable())
# 读取一行内容,光标移动到第二行首部
print(func.readline())
# end='':去除换行
print(func.readline(), end='')# 如果readline()方法和read()方法一起使用会打印一行空格(什么都没有)
# 读取文件全部内容,存放于列表中,显示一行内容
print(func.readlines()) # 如果readlines()方法和read()方法一起使用会打印空列表([])
# 文件是否关闭
func.closed
# 回收操作系统级打开的文件
func.close()
# 立刻将文件内容从内存刷到硬盘
f.flush()
注:
1.如果被打开文件在当前操作文件的同一硬盘文件位置则可以只输入相对路径,如果不在同一硬盘文件路径则必须输入绝对路径。
2.f=open(...)是由操作系统打开文件,如果我们没有在open函数中指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
写操作('w')
'''
:w 写
如果文件存在清空文件内容,在写入
如果文件不存在则创建一个新的文件
'''
func = open('口是心非.txt', 'w', encoding='utf-8')
# 针对文本模式的写,需要自己写换行符,如果不加则显示一行
print(func.write('123\n456\n')) # 打印写入的文件内容的个数,如果不能使用print()不会打印个数
func.write('1\n')
func.write('1\n')
# 文件是否可写
func = func.writable()
print(func)
# 按照列表形式写入,写入的文件内容必须是字符串,则报错
print(func.writelines(['555\n', '66666\n']))# 如果写成一个列表形式,打印是None,如果不能使用print()不会打印None
# 文件是否关闭
func.closed
# 关闭文件
func.close()
# 立刻将文件内容从内存刷到硬盘
f.flush()
追加操作('a')
'''
将写入的文件内容追加到原文件内容的末尾,如果追加的文件不存在则会在指定位置新建一个指定名字的文件,
本质上就是一种写模式,不同于写模式
'''
func = open('口是心非', 'a', encoding='utf-8')
func.write('口是心非') # 在最后一行追加
func.close()
with as关键字
使用with关键字来帮我们管理上下文,执行文件操作时不需要在末尾加入close语句
with open('口是心非.txt', 'r') as func,\
open('口是心非_new', 'w') as func1:
data = func.read()
func1.write(data)
可读可写模式('r+')
with open('口是心非.txt', 'r+', encoding='utf-8') as func: # 先读后写
func.read()
func.write('Hello')
# 不移动光标文件内容末尾则覆盖原有文件内容
with open('test', 'r+', encoding='utf-8') as func:
func.read()
func.write('world')
三种b模式(非文本模式)
"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
读操作二进制显示('rb')
func = open('口是心非.txt', 'rb')
data = func.read()
# 解码格式'utf-8'
print(data.decode('utf-8'))
func.close()
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
写操作二进制显示('wb')
func = open('口是心非.txt', 'wb')
func.write(bytes('你好,优乐美\n', encoding='utf-8'))
# 针对b模式的写,需要自己写换行符
func.write('1111\n222\n'.encode('utf-8'))
func.writelines([bytes('333\n', encoding='utf-8'), '444\n'.encode('utf-8')])
func.close()
追加操作二进制显示('ab')
# 从原文件内容最后一个位置,开始往后写
func = open('口是心非.txt', 'ab')
func.write('口是心非'.encode('utf-8'))
func.close()
seek用法
-
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
-
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起
-
seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
func = open('seek.txt', 'rb')
# print(func.tell())
# 相对位置0开始
func.seek(10, 1)
# 光标所在的位置
print(func.tell())
# 上一层相对位置是10,打印相对位置13
func.seek(3, 1)
print(func.tell())
# 负数倒序从后向前,第几个字符
func.seek(-5, 2)
print(func.read())
使用seek方法读取最后一行
1.新建一个口是心非.txt文件
口是心非》是由张雨生作词作曲并演唱的一首歌,收录于同名专辑《口是心非》中。
张雨生(1966年6月7日-1997年11月12日),出生于台湾省澎湖县马公市,歌手、音乐人、制作人。
1988年自组金属小子乐团;同年因演唱《我的未来不是梦》而获得关注 。
1989年推出首张专辑《天天想你》。1990年10月入围第二届金曲奖最佳男演唱人。
1992年凭借歌曲《大海》走红。1997年推出专辑《口是心非》,获得第9届台湾金曲奖最佳流行音乐演唱唱片奖。
# 用seek()方法从后往前搜索,使用rb模式
func = open('日志文件', 'rb')
# 使用with关键字
with open('日志文件', 'rb') as func:
for i in func:
offs = -100 # 设置偏移量(估计最后一行的长度)
while True:
func.seek(offs, 2)
data = func.readlines()
if len(data) > 1:
print('文件最后一行%s' % (data[-1].decode('utf-8')))
break
offs *= 2
打印结果:
1992年凭借歌曲《大海》走红。1997年推出专辑《口是心非》,获得第9届台湾金曲奖最佳流行音乐演唱唱片奖。