V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
newworld
V2EX  ›  问与答

Python 增量读取问题

  •  
  •   newworld · 2018-11-14 21:44:16 +08:00 · 1140 次点击
    这是一个创建于 2230 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    出错

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

    < 可以了 谢谢你 @Sylv 解答这些细节 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3258 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:10 · PVG 20:10 · LAX 04:10 · JFK 07:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.