【1.41】文件的seek 方法

 1 #coding=utf-8
 2 #seek 移动光标 是按字节来移动,注意汉字字节  utf-8 是三个字节  gbk 是两个字节
 3 #read是字符读取
 4 with open("test","w",encoding="utf-8") as f:
 5     f.write("我爱你\nbaby\n")
 6 
 7 with open("test","r+",encoding="utf-8") as f:
 8     print(f.tell())  #位置 0
 9     print(f.read(2))  #是读三个字符  我爱
10     f.seek(1)   #位置移动 1,向前移动一个字节了   但是光标移动是最开始位置移动
11     print(f.tell()) #向前移动一个字节了  从这里就可以看出 光标位置在 第一个位置 打印的就是 1
12     #print(f.read())    # 这里就读不出来要报错说 utf8 不能解码,说开始的字节位置不对
13     # ,要是读出来 可能乱码,也可能巧合读一些字

 

 

 1 #coding=utf-8
 2 #seek 移动光标 是按字节来移动,注意汉字字节  utf-8 是三个字节  gbk 是两个字节
 3 #默认就是相对 0 的位置 移动 一般()里面就没有写 0   这里也不用指定打开模式为 b
 4 #但是相对 移动一定要以 b 模式打开后进行移动
 5 #read是字符读取
 6 with open("test","w",encoding="utf-8") as f:
 7     f.write("我爱你\nbaby\n")
 8 
 9 with open("test","r+",encoding="utf-8") as f:
10     print(f.tell())  #位置 0
11     print(f.read(2))  #是读三个字符  我爱
12     f.seek(1)   #位置移动 1,向前移动一个字节了   但是光标移动是最开始位置移动
13     print(f.tell()) #向前移动一个字节了  从这里就可以看出 光标位置在 第一个位置 打印的就是 1
14     #print(f.read())    # 这里就读不出来要报错说 utf8 不能解码,说开始的字节位置不对
15     # ,要是读出来 可能乱码,也可能巧合读一些字
16     f.seek(3)   #这里还是从最开始位置移动的
17     print(f.read(2))  #这里读出来的就是 我 后面的两个字符  注意read 是读字符 哦 所以就 爱你
18 
19 
20 with open("test","rb+") as f:
21     #看 seek 还有很多参数方法  这里就是相对移动 需要使用 b 模式打开
22     print(f.tell())
23 #位置 0
24     f.seek(3)   #移动到 我后面
25     print(f.read(3).decode("UTF-8"))
26     #读字符 爱的 三个编码  解码就是 爱   费解这里read 就是一个编码一个编码读取的和seek一样
27     #跟编码方式有关  read 和seek 在 二进制 b模式打开 读取就是一样的
28     print(f.tell())   #位置 6  两个汉字就 6
29     f.seek(3,1)   #这个就是相对目前位置  向后移动两个字节   这里就到了\n后面,# b前面
30     print(f.tell())  # 位置 9  两个汉字 + 你 就 9 了,  就到了\r\n的前面了
31     print(f.read(2)) #读取了换行 \R\N
32     print(f.tell())  #就是11
33 with open("test","rb+") as f:
34     #看看向后面读取,从后网钱读取  采用参数 2   前面移动位数用 负数
35     # 可以为正  但是这就是网后面读正数个位   不要这样操作
36     #还是b模式打开
37     print(f.tell())   #位置是 0
38     f.seek(-1,2)
39     print(f.tell())  # 位置是 16  文本共计17个字节
40     print(f.read())  #打印肯定是\n
41 
42     f.seek(-2, 2)
43     print(f.tell())  # 位置是 15  文本共计17个字节
44     print(f.read())  # 打印肯定是\r\n
45 
46 #如果只是读取最后一行 比如找日志 都是从后网钱找 就要用 2 模式
47 with open("test","rb+") as f:
48     #定义偏移量 offset = 3  我们每段较短  这个值是预估的
49 
50     # data=f.readlines()
51     # print (len(data))
52     #循环文件  就用这个 f 句柄就好 不要用 read 或者 readlines
53     # for i in f:
54     offset = -2
55     while True:
56         f.seek(offset, 2)
57         data = f.readlines()
58         print(data)
59         if len(data) > 1:
60             print(data[-1].decode("utf-8"))
61             break
62         else:
63             offset *= 2
64             
65             
66 with open("test","rb+") as f:
67     #定义偏移量 offset = 3  我们每段较短  这个值是预估的
68 
69     # data=f.readlines()
70     # print (len(data))
71     #循环文件  就用这个 f 句柄就好 不要用 read 或者 readlines
72     for i in f:
73         print (i)

 

posted @ 2016-03-29 20:05  科学小怪癖  阅读(228)  评论(0)    收藏  举报