Python 增量读取问题

2018-11-14 21:44:16 +08:00
 newworld

如题: 我有一个文本里面大概是这样的网址:

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 给点建议,如何解决?

1107 次点击
所在节点    问与答
4 条回复
Sylv
2018-11-15 03:37:13 +08:00
问题一:

如果用 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 去掉才能实现「接着读取五行数据」。
newworld
2018-11-16 18:37:44 +08:00
@Sylv 谢谢大哥指点 回去试试
newworld
2018-11-16 18:39:24 +08:00
@Sylv 哇 点开你的头像进去发现居然是我关注的 😁
newworld
2018-11-16 21:19:19 +08:00

< 可以了 谢谢你 @Sylv 解答这些细节 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/507919

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX