python读取⽂件seek⽅法_Python⽂件读取细节——
seek,tell,read。。。
这篇⽂章介绍Python中⽂件操作最常⽤的
读⽂件相关的函数
和其中某些易错点。
1.函数功能介绍
可以先运⾏下⾯的例⼦,然后对⽐运⾏结果理解函数功能!
tell():返回当前的指针相对于⽂件开始的偏移量
-utf8编码下:如果是中⽂的话,⼀个字的偏移量是3。
-每⼀⾏的末尾其实是\r\n,代表了2个偏移量
seek(offset, from):定位⽂件指针
offset:偏移量。
-如果是⽂本⽂件
-需满⾜以下条件:from=0时,offset>=0;from=1或2时,offset必须为0;
-若其中含有中⽂字符,注意from=0时,指针不要对⼀个中⽂字符的⼆进制编码(包含3个偏移量)中间,否则报错。
⼀般较难确定正确的位置,所以建议直接设置为0
-如果是对⼆进制⽂件,需满⾜以下条件:
-from=0时,offset>=0;
-from=1,offset可任意(不要超过总⽂件的范围);
-from=2,offset<=0(不要超过总⽂件的范围);
from:⽅向
0:表⽰⽂件开头
1:表⽰当前位置
2:表⽰⽂件末尾
read(size):读取⽂件中size长度的字符串
-size表⽰从当前指针位置开始读取字符的长度。如果⽆参数,则默认读取该⽂件全部数据
-utf8编码的⽂本⽂件下:中⽂、英⽂、换⾏的每个字符长度都代表1
-⼆进制下:utf8编码后以⼆进制读取,每个中⽂代表长度3,读取长度与⽂件指针变化⼀样。
如:xx.read(10),⽂件指针就+10
readline(size) :读取⾏
-从当前指针位置开始读⼀⾏,如果定义了size,有可能返回的只是⼀⾏的⼀部分
readlines(size) :读取多⾏
-从当前指针位置开始把⽂件每⼀⾏作为⼀个list的⼀个成员,并返回这个list。
-
其实它的内部是通过循环调⽤readline()来实现的。
-如果提供size参数,size是表⽰读取内容的总长,也就是说可能只读到⽂件的⼀部分。
-如果最后指针停留在某⼀⾏的中间,那么⾃动将该⾏全部读取。也就是说执⾏完该函数之后,⽂件指针总停留在下⼀⾏开头(对⾏取整) 2.函数使⽤
例⼦:
utf8编码的⽂本⽂件内容如下:
这是第⼀⾏数据
abcdefghijk0
这是第三⾏数据
abcdefghijk2
abcdefghijk3
abcdefghijk4
abcdefghijk5
abcdefghijk6
abcdefghijk7
abcdefghijk8
abcdefghijk9
end!
代码测试:
1.以“utf8”编码读取
dir_path = "../output"
file_name = ""
fp = open(dir_path + "/" + file_name, "r",encoding='utf8')python怎么读文件
print("当前⽂件指针位置 : ", fp.tell())
str = fp.read(18) # 见说明1
print("fp.read(18)读取到的数据 : ", str)
print("当前⽂件位置 : ", fp.tell()) # 见说明2
fp.seek(9,0) # 见说明3
print("fp.seek(9,0),当前⽂件指针位置 : ", fp.tell())
adline() # 见说明4
print("fp.readline()读取到的数据 : ", str)
print("当前⽂件指针位置 : ", fp.tell())
输出
说明
说明1:
读取得到的字符串为
这是第⼀⾏数据\nabcdefghij
,加上换⾏⼀共18个字符,说明该函数对每个中⽂、英⽂字符和换⾏的长度都视为1。
说明2:
print("当前⽂件位置 : ", fp.tell())
改⾏代码执⾏后,指针位置在
33
计算⽅法:7个中⽂字符,占7×3=21个偏移量,
\n
在读取后是
\r\n
占2个偏移量,
abcdefghij
占10个偏移量,共35个偏移量。
说明3:
fp.seek(9,0)
表⽰指针⼜从⽂件头开始,因为utf8编码下每个中⽂字符占3个偏移量,9个偏移量就是3个中⽂字符之后。说明4:
从当前指针位置也就是第⼀⾏的第三个字符开始,读取⼀整⾏,包括换⾏符,得到
⼀⾏数据\n
,然后⽂件指针总停留在下⼀⾏开头
另外,
也是从从当前指针位置开始读取,以列表返回,可以⾃⾏尝试
2.同样的测试⽂件和代码,只是以⼆进制读取
dir_path = "../output"
file_name = ""
fp = open(dir_path + "/" + file_name, "rb") #改变为⼆进制读取
print("当前⽂件指针位置 : ", fp.tell())
str = fp.read(18) # 见说明
print("fp.read(18)读取到的数据 : ", str)
print("当前⽂件位置 : ", fp.tell())
fp.seek(9,0)
print("fp.seek(9,0),当前⽂件指针位置 : ", fp.tell())
adline()
print("fp.readline()读取到的数据 : ", str)
print("当前⽂件指针位置 : ", fp.tell())
输出
说明
utf8编码后以⼆进制读取,每个中⽂代表长度3,
read(3)
已经不再是读取3个中(英)⽂字符,⽽是3个8位的16进制数了。举个例⼦,看输出的第⼆⾏:
\xe8\xbf\x99
这三个表⽰了3个字节,⼀个字节是8位的16进制数,所以
tell()
说指的偏移量其实就是内存地址的指针偏移,1个偏移量就是1个字节⼤⼩。
其它函数根据上⾯的说明可以⾃⾏尝试,重点部分已经详细说明了,原理的话⾄今还不太懂,关于中⽂字符的编码,所以欢迎⼤佬指点菜鸟!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。