python学习之七(文件的操作)

文件的操作要注意路径的问题,这里用的都是相对路径。

# 文件操作 r:写模式,w:读模式,建立新文档覆盖原来的文档
# f=open('a.txt','r',encoding='utf-8')
# # data=f.read()
# # print(data)
# # 可读文件,默认是可读文件,readline是读文件第几行
# print(f.readable())
# print('第一行:',f.readline(),end='') # end=''表示取消换行
# print('第二行:',f.readlines())

# f=open('b','w',encoding='utf-8')
# f.write('111111111111\n')
# f.write('2222222222222\n')
# f.writelines(['第五行\n','第六行\n'])  # 以列表的形式写入文件
# f.close()

# 追加模式,一般在日志文件用的多
# f=open('b','a',encoding='utf-8')
# f.write('写到文件最后')
# f.close()

# 读写模式 写的时候只从光标的位置往后写
# f=open('b','r+',encoding='utf-8')
# print(f.read())
# f.write('离离原上草')
# print(f.read())

# 只往新文件里写一行
# src_f=open('b','r',encoding='utf-8')
# data=src_f.readlines()
# src_f.close()
# dst_f=open('b_new','w',encoding='utf-8')
# dst_f.write(data[0])
# dst_f.close()

# 使用with可以不用close语句
# with open('b','w') as f:
#     f.write('1111\n')

# with open('a.txt','r',encoding='utf-8') as src_f,\
#         open('b','r',encoding='utf-8') as dst_f:
#         print(src_f.read())
#         print(dst_f.read())

# 以字节方式操作文件 后面不需要编码方式
# f=open('a.txt','rb')
# data=f.read()
# print(data)
# # 没有编码方式还想看到内容进行解码
# print(data.decode('utf-8'))

# 写字节文件时,要对字符串进行编码
# f=open('a_new','wb')
# f.write(bytes('11111111\n',encoding='utf-8'))
# f.write('小狗'.encode('utf-8'))

# f=open('b','r+',encoding='latin-1')
# data=f.read()
# print(data)

# python会在最后加一个/r,用newline来读取文件换行符号 seek用来控制光标的移动
# f=open('a.txt','r+',encoding='utf-8',newline='')
# print(f.readline())
# print(f.tell())
# # 把光标往后移动三个字节
# f.seek(3)
# print(f.tell())
# # 从光标往后的四个字符
# print(f.read(4))

# 使用f.truncate(10)来截取文件,截取的是字节,不是字符

# seek方法的使用,最好用b的方式打开文件
# f = open('a.txt','rb')
# print(f.tell())
# # 2代表倒叙seek,倒叙seek10个字符,对于处理日志文件经常用
# f.seek(-15,2)
# print(f.read())
# print(f.tell())
# # seek是从开头部分开始的
# f.seek(3)
# print(f.tell())
# # seek还能设置从哪开始到哪结束
# f.seek(3,1)
# print(f.tell())
# 循环文件内容,一次只循环一行

f=open('日志文件','rb')
for i in f:
print(i)
 

在实际的应用程序开发过程中,日志文件的数据量可能会特变大,如果还是从头开始会导致读取时间过长,所以只能从文件的最末端往前读,我们往往想读取的是日志文件的最后几行操作,那么如何获取日志文件最后一行操作呢:

f=open('日志文件','rb')
for i in f:
    # 定义一次的偏移量
    offs=-50
    while True:
        f.seek(offs,2)
        data=f.readlines()
        if len(data) > 1:
            # data[-1]:取出最后一行
            print('文件的最后一行是%s' %(data[-1].decode('utf-8')))
            break
        offs*=2

在循环体中,定义一次的偏移量,这里的偏移量是指字节,f.seek(offs,2)表明从文件的末尾开始循环,data取出一次偏移量所读取的行数,如果读取的行数大于1行,则取出最后一行,并用utf-8编码格式进行解码,并且终止循环;如果一次偏移量所读取的行数不大于1行,则增加偏移量offs*=2,继续循环读取,直到行数大于1行为止。文件内容如下所示:

输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值