标签:mic 报错 打开 val errno 撤销 增加 启用 返回值
b‘str‘
模式,例如:fo.write(b‘str‘)cmd命令行下建一个纯净文件:echo ABCDEFG>a.txt
ABCDEFG
如何界定「seek(0)」? 它究竟是「第一个字符」还是「第一个字符之前的空字符」?
f=open(‘../a.txt‘,‘r‘)
f.seek(0)
print(f.tell()) # 0
print(f.readline()) #ABCDEFG
f.seek(1,0)
print(f.tell()) #1
print(f.readline()) #BCDEFG
f.seek(2,0)
print(f.tell()) #2
print(f.readline()) #CDEFG
# 通过本例我们得知:seek()指向哪位,我们就从哪位开始读取.
?
通过上面实验得:seek(0)使得指针指向「文本对象首位字符」的位置,而不是空位.
查阅了不少资料,并没有找到「.tell()返回值就是字符的序列号的权威解释,但用.tell()返回的数值作为字符的定位工具是很好的,我就暂时这么叫它了」
如何定义「末位」?
1.它究竟是「文本对象最后一个字符」还是「最后一个字符之后的空字符」?
2.究竟read()完毕后指针所在位是末尾?还是seek(0,2)才使指针指向末尾?
依然使用上例的文本 a.txt
ABCDEFG
#seek(offset,1&2)皆要使用‘rb‘模式打开.
# 首先用read()预览下文件,rb会将‘\r\n‘如实的显示出来,但它们只在你回车换行后会出现,如果文件没有回车换行过,就不会有‘\r\n‘出现.——这指的是单行状态,如果是多行:每次换行一定有‘\r\n‘,但最尾部没有。(当然你也可以手贱非要在末尾回车一下而使我前面写的全白费.)
# 总之,‘\r\n‘是可以人为增加的,无甚定则,只要明白它的意思就好.
f=open("f:/work/a.txt","rb")
print(f.read()) #b‘ABCDEFG\r\n‘
print(f.tell()) #9 ,文件读取完毕,指针指向9,按‘A=0位的规则‘,9位为空,并无字符.
f.seek(0,2) #强行将指针指向尾部
print(f.read()) #b‘‘ ,得到的是空字符.
print(f.tell()) #9
#从尾部逆向偏移1位,并在此处读取得到b‘\n‘,说明:seek(-1,2)初始位是9(空),逆向移动一位到8.
f.seek(-1,2)
print(f.tell()) #8
print(f.read()) # b‘\n‘
f.close()
通过上述实验得知:不论read/readline/readlines操作还是seek(offset,2)操作,他们均非指向文本对象的末位,而是末位的下一个空位.
?
图中seek(0,2)指向9号空位.
本次使用C文本:
ABCDE
abcde
f=open("f:/work/c.txt","rb")
print(f.read()) #b‘ABCDE\r\nabcde‘
print(f.tell()) #12
f.seek(2,1) #在当前位向后偏移2位
print(f.tell()) #14
print(f.read()) #b‘‘
#虽然末位12之后是空字符,但依然可以读取出b‘‘,不会报错
f.seek(-5,1)
print(f.tell()) #9
print(f.read()) #b‘cde‘
f.seek(-16,1)
print(f.tell())
print(f.read())
# 报错 OSError: [Errno 22] Invalid argument
#seek可以向后无限定位,但向前超出首位就会报错.
f.close()
标签:mic 报错 打开 val errno 撤销 增加 启用 返回值
原文地址:https://www.cnblogs.com/deepblue775737449/p/12696152.html