如题: 我有一个文本里面大概是这样的网址:
https://www.v2ex.com/t/1
https://www.v2ex.com/t/2
https://www.v2ex.com/t/3
https://www.v2ex.com/t/4
https://www.v2ex.com/t/5
https://www.v2ex.com/t/6
https://www.v2ex.com/t/7
https://www.v2ex.com/t/8
https://www.v2ex.com/t/9
https://www.v2ex.com/t/10
比如我想先读取第一行到第三行的,然后做其他的事情后,再接着从第三行读取 N 行,做另外的事. 我的代码如下,出现后面的读取内容不全。。。
def read_num_split():
with codecs.open(fileName,'r','utf-8') as f:
for i in range(0,3): #读取三行数据
data = f.readline().strip()
label = f.tell() #记录读取到的位置
print(data)
#再次读取
for i in range(0,5): #接着读取五行数据
data = f.readline().strip() #接着上次的位置继续向下读取
f.seek(label,0) #把文件读取指针移动到之前记录的位置
# sys.stdout.write("接着读取")
print(data)
read_num_split()
出错截图如下,刚学 python 练手,就遇到了这个问题,小弟搜索了半天,也没有解决,各位社区 V2er 给点建议,如何解决?
1
Sylv 2018-11-15 03:37:13 +08:00 1
问题一:
如果用 codecs.open 来打开文本文件,file.tell 的值并不是字符在文本文件里的位置,而是底层字节流的位置。而 file.seek 接收的还是字符流位置,你把字节流位置传给了它,所以它就定位错了,出现了行被截断的情况。 在 Python3 下,解决办法是改用 open(filename, 'r', encoding='utf-8') 来打开文本文件,codecs.open 是过时的方法。用 open 打开文本文件,file.tell 和 file.seek 的值是一致的,都是字符流的位置,因此不会定位出错。 问题二: 你的代码即使改用 open 来打开文件后,还是无法实现「接着读取五行数据」,因为你在第二个循环里每次都用 f.seek(label,0) 回到了第三行的结尾,导致接下来每次读取出来的都是第四行。你要把 f.seek 去掉才能实现「接着读取五行数据」。 |