# 以读r的方式打开文件
f=open('a.txt',encoding='utf-8',mode='r')
print(f) # f是一个文件句柄对象
data1=f.read() # 读文件
print(data1)
print('=====================================')
data2=f.read() # 读不到内容,因上面读过一次文件,读取文件的光标指针已经移动到文件末尾
print('data2====>',data2) #读不到内容
f.close()
# ############## File seek() 方法#######################
# seek() 方法用于移动文件读取指针到指定位置。
# 语法
# seek() 方法语法如下:
# fileObject.seek(offset[, whence])
# 参数
# offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
# whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
# 返回值
# 该函数没有返回值。
# 实例
# 以下实例演示了 readline() 方法的使用:
# 文件 runoob.txt 的内容如下:
# 1:www.runoob.com
# 2:www.runoob.com
# 3:www.runoob.com
# 4:www.runoob.com
# 5:www.runoob.com
# 循环读取文件的内容:
# 打开文件
fo = open("runoob.txt", "rw+")
print("文件名为: ", fo.name)
line = fo.readline()
print("读取的数据为: %s" % line)
# 重新设置文件读取指针到开头
fo.seek(0, 0)
line = fo.readline()
print("读取的数据为: %s" % line)
# 关闭文件
fo.close()
# 以上实例输出结果为:
# 文件名为: runoob.txt
# 读取的数据为: 1:www.runoob.com
# 读取的数据为: 1:www.runoob.com
########################################
f = open('a.txt', encoding='utf-8', mode='r')
print(f.closed) # 判断文件是否是关闭状态
print(f.encoding) # 获取文件的字符编码
print(f.name) # 获取文件名
print(f.readable()) # 判断文件是否是r模式打开的
f.close()
f = open('a.txt', encoding='utf-8', mode='r')
print(f.readline(),end='') # 一次读一行,print打印一行末尾默认有一个换行符,end=''将换行符去掉
print(f.readline())
print(f.readline(),end='')
f.close()
f = open('a.txt', encoding='utf-8', mode='r')
print(f.readlines()) # 一次读取所有行的内容,存成列表的形式
f.close()
f1=open('b.txt','w',encoding='utf-8') # 以写w的方式打开文件:文件存在则清空,不存在则创建
f2=open('a.txt','r',encoding='utf-8') # 以读的方式打开文件,文件不存在则报错
print(f1.writable()) # 判断文件是否以写的方式打开(是否可写)
f1.write('111111\n22222222')
f1.seek(0) # 将写文件的光标指针移动到文件开始位置
f1.write('\n333333\n444444') # 再次写入将覆盖f1.write('111111\n22222222')的写入
f1.writelines(['\n55555\n','6666\n','77777\n']) # 将列表写入文件,每个列表元素一行
f1.close()
# ###文件的修改操作###
import os
read_f=open('b.txt','r',encoding='utf-8')
write_f=open('.b.txt.swap','w',encoding='utf-8') # 创建一个写临时文件句柄对象
for line in read_f.readlines(): # 循环读取的文件每一行(列表)
if line.startswith('333333'):
line='2222222222\n' # 替换一行的内容
write_f.write(line)
read_f.close()
write_f.close()
os.remove('b.txt') # 删除原文件
os.rename('.b.txt.swap','b.txt') # 将临时文件重命名为原文件名
#################################
# 其他文件操作模式
# f=open('a.txt','r+') #读写
# f=open('a.txt','w+') #写读
# f=open('a.txt','a+') #追加并且读
# 文件上下文管理,通过with关键字打开的文件当程序退出缩进之后自动关闭文件句柄,不需要再f.close()
with open('a.txt', 'r', encoding='utf-8') as f_a, open('b.txt') as f_b:
print(f_a.read())
print('====>')
# 补充for或者while循环和else字句结合使用,当for或者while循环不被break打断,就会执行else的代码
# 用法:循环如果正常执行完成的话就打印日志,标识循环完成。
for i in range(3):
print(i)
# continue
if i == 1:
break # 循环被break之后,就不会执行else代码
else:
print('=============>') #当for循环不被break打断,就会执行else的代码
# 如下例,文件正常写完之后,打印日志写入完成
with open('a.txt','r',encoding='utf-8') as read_f,\
open('aa.txt','w',encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line)
else:
print('write successfull') #如果写入失败则不会打印该行。
###以字节方式读取文件,需要解码后才可正常显示字符
with open('a.txt','rb') as f:
print(f.read().decode('utf-8'))
###以字节方式写文件,并指定文件编码格式是utf-8
with open('c.txt','wb') as f:
f.write('哈哈哈'.encode('utf-8'))
# 文本的方式读不了二进制文件(例如图片),如下方式读取图片报错
f=open('sb.jpg','r',encoding='utf-8')
print(f.read())
# 二进制文件需要以字节码的方式读取和写入,如下代码是将一张图片复制了一份:
with open('sb.jpg','rb') as read_f,\
open('sb_alex.jpg','wb') as write_f:
data=read_f.read()
write_f.write(data)
with open('a.txt','r',encoding='utf-8') as f:
print(f.read(3)) # 数字指的是读3个字符
with open('a.txt','rb') as f:
print(f.read(2)) # 数字指的是读取2个字节(bytes)
with open('a.txt','r',encoding='utf-8') as f:
f.seek(3) # seek内指定的数字代表光标移动的字节数
print(f.tell()) # 当前光标所在的位置
print(f.read())
with open('aa.txt','r+',encoding='utf-8') as f:
f.seek(3) # seek内指定的数字代表光标移动的字节数
print(f.read())
f.truncate(1)
with open('b.txt','rb') as f:
f.read()
f.seek(3) # 默认情况,是以文件起始位置作为开始,往后移动3个bytes
print(f.read(1)) #开始读取第4个字节
print(f.tell()) # 当前光标位置应该是第4个字节处
f.seek(2,1) # 第二个参数1代表以当前光标所在的位置为开始,往后移动(第一个参数)2个 bytes
print(f.tell()) # 此时光标应该在第6个字节处
f.seek(-1,2) # 第2个参数 2 表以文件末尾位置为开始,第1个参数 -1 标识往前移动1个 bytes
print(f.tell())
f.seek(0,2) #光标移动到文件末尾
print(f.tell())
with open('c.txt','r',encoding='utf-8') as f:
f.seek(0,2) #光标移动到文件的末尾开始,往后移动 0 个字节。
print('====>',f.read())
## tail -f access.log tail -f 命令应用
import time
with open('access.log','r',encoding='utf-8') as f:
f.seek(0,2)
while True:
line=f.readline().strip()
if line:
print('新增一行日志',line)
time.sleep(0.5)