【菜鸟零基础学习笔记】Day18-文件操作的其他方法、文件处理b模式、seek方法补充

【closed】

判断文件是否关闭

f = open('a.txt','w')
print(f.closed)   #False

 

【encoding】

取的是文件打开的编码,和原文件以什么编码存储无关

f = open('a.txt','w', encoding='utf-8')
print(f.encoding)   

输出:
utf-8

a.txt文件以utf-8格式存放在硬盘上,但是encoding语句取的是文件打开时所使用的编码

但是,如果存放的格式和解码的格式不一致的话,就会出现乱码的现象

 

如果不知道文件使用什么格式存储的,可以用latin-1

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

latin-1可以尽可能多的还原原文件

 

【flush()】

自动刷新保存(每隔一段时间把内存里的数据自动保存到硬盘里)

 

【tell()】

当前光标所在的位置(光标的移动以字节为单位,回车算一个字节)

原test2内容:

你好
abcd

用tell()获取光标所在的字节:

example1:

f = open('test2','r', encoding='utf-8')
print(f.tell())
print(f.readline())
print(f.tell())

输出:
0
你好

8   #读出8是因为中文占三个字节,回车占两个字节,如果用rb模式读取的话是\r\n

example2:

f = open('test2','r', encoding='utf-8')
print(f.tell())
print(f.readlines())
print(f.tell())

输出:
0
['你好\n', 'abcd']
12

注意:以上差异是由于函数readline()和readlines()的不同造成的

 

【补充open()的参数newline】

原test2中的内容:

你好
abcd

newline用法举例:

---------------不使用newline参数---------------

f = open('test2','r', encoding='utf-8')
print(f.readlines())

输出:
['你好\n', 'abcd']

---------------使用newline参数---------------

f = open('test2','r', encoding='utf-8',newline='')
print(f.readlines())

输出:
['你好\r\n', 'abcd']

注意:虽然windows系统中,回车是\r\n,但是python默认将回车全部转换为\n的形式,newline参数为空可将回车按原始形式读出

 

【seek()】

用来控制光标的移动(移动单位为字节)

原test2中的内容:

你好
abcd

example1:

f = open('test2','r', encoding='utf-8')
f.seek(0)
print(f.tell())
print(f.readline())

输出:
0
你好

example2:

f = open('test2','r', encoding='utf-8')
f.seek(3)
print(f.tell())
print(f.readline())
print(f.read())


输出:
3
好

abcd

seek函数的第二个参数:可以指定从哪里开始seek

原test2中的内容:

你好
ab
123
456

example1:参数为0

f = open('test2','r',encoding='utf-8')
f.seek(3,0)  #从0位置开始seek(默认值)

example2:参数为1

f = open('test2','rb')   #二进制模式不能有encoding arguments
f.seek(3,1)  #从上一次光标停留的位置开始seek(这种情况下需要用rb模式打开文件)

 example3:参数为2

f = open('test2','rb')
f.seek(-5,2)
print(f.read())


输出:
b'\r\n456'

应用举例:读数据条数比较多的日志文件时,用seek函数查找最后一条日志可以节约内存

方法1:readlines方法。

缺点:需要将整个文件都读进内存成为一个列表,占用空间较大

f = open('test2','rb')
data = f.readlines()
print(data[-1].decode('utf-8'))

输出:
456

方法2:seek方法。

直接用文件名进行for循环,并使用seek函数得到最后一行。

优点:直接用文件名进行for循环时,要一行给一行,避免了占用过多内存空间的问题

f = open('test2','rb')
for i in f:
    print(i)

具体实例:

原test2内容:

你好
ab
123
456

高级解法

f = open('test2','rb')
for i in f:
    offs = -10
    while True:
        f.seek(offs,2)
        data = f.readlines()
        if len(data)>1:
            print('%s' %(data[-1].decode('utf-8')))
            break
        offs*=2

输出:
456

 

【read()】

原test2中的内容:

你好
abcd

example:

f = open('test2','r',encoding='utf-8')
data = f.read(1)
print(data)   #你

注意:tell()和seek()都是按字节读取数据,但是read()读取数据的单位是字符

 

【truncate()】

作用:truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字节大小。 

语法:

fileObject.truncate( [ size ])

size -- 可选,如果存在则文件截断为 size 字节

没有返回值

原test2中的内容:

你好
abcd

example:

f = open('test2','a+',encoding = 'utf-8')  #a+和r+都可以,但是w+不行,因为w+会把数据清空
f.truncate(10)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值