Python stream.tell()返回不正确的位置

Python stream.tell()返回不正确的位置,python,file,newline,Python,File,Newline,尝试在读取一行后使用tell()获取光标位置。它似乎与文本模式和\r有关。我是误用了这个方法还是它是一个bug?谢谢 使用python2.6、2.7、3.3进行测试,所有测试都具有相同的输出 import io with io.open('a', 'w') as fo: fo.write(u'abc\n') fo.write(u'def\r\n') fo.write(u'hij\r') fo.write(u'klm') print('*io.open rb*'

尝试在读取一行后使用tell()获取光标位置。它似乎与文本模式\r有关。我是误用了这个方法还是它是一个bug?谢谢

使用python2.6、2.7、3.3进行测试,所有测试都具有相同的输出

import io

with io.open('a', 'w') as fo:
    fo.write(u'abc\n')
    fo.write(u'def\r\n')
    fo.write(u'hij\r')
    fo.write(u'klm')

print('*io.open rb*')
with io.open('a', 'rb') as fo:
    print('--%r--%d' % (fo.readline(), fo.tell()))
    print('--%r--%d' % (fo.readline(), fo.tell()))
    print('--%r--%d' % (fo.readline(), fo.tell()))
    print('--%r--%d' % (fo.readline(), fo.tell()))


print('*io.open rt*')
with io.open('a', 'rt') as fo:
    print('--%r--%d' % (fo.readline(), fo.tell()))
    print('--%r--%d' % (fo.readline(), fo.tell()))
    print('--%r--%d' % (fo.readline(), fo.tell()))
    print('--%r--%d' % (fo.readline(), fo.tell()))
输出:(不确定34028236700016662599608568909021713421是什么)


文本文件中有三种类型的EOL(行尾):

  • windows:\r\n
  • unix(linux):\n
  • mac:\r
您必须使用格式正确的EOL

  • 尝试创建unix格式文件:io.open('a','w')
  • 或者使用此选项创建unix格式文件:io.open('a','wb')
  • 并且不要使用“\r”unix或windows格式:
windows格式文件:

            import io

            with io.open('a', 'w') as fo: #this will be a windows format file
                fo.write(u'abc\n')
                fo.write(u'def\n')
                fo.write(u'hij')
                fo.write(u'klm')


            print('*io.open rb*')
            with io.open('a', 'rb') as fo:
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))

            print('*io.open rt*')
            with io.open('a', 'rt') as fo:
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))

            >>>

            *io.open rb*
            --'abc\r\n'--5
            --'def\r\n'--10
            --'hijklm'--16
            --''--16

            *io.open rt*
            --u'abc\n'--5
            --u'def\n'--10
            --u'hijklm'--16
            --u''--16
            >>>

            import io

            with io.open('a', 'wb') as fo: #this will be a unix format file
                fo.write(u'abc\n')
                fo.write(u'def\n')
                fo.write(u'hij')
                fo.write(u'klm')

            print('*io.open rb*')
            with io.open('a', 'rb') as fo:
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))

            print('*io.open rt*')
            with io.open('a', 'rt') as fo:
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))

            >>>
            *io.open rb*
            --'abc\n'--4
            --'def\n'--8
            --'hijklm'--14
            --''--14

            *io.open rt*
            --u'abc\n'--4
            --u'def\n'--8
            --u'hijklm'--14
            --u''--14
            >>>

正如你所见,结果总是一样的,没有那个奇怪的长数字

什么平台?这看起来像是一个溢出错误。可能与以下内容有关:我使用的是Mac OS X 10.9.3。刚刚注意到它是
io。open
而不是内置的。在这种情况下,可能是相关的:这个号码不是必需的,也不希望是可以理解的。@user2357112,谢谢。这实际上可以通过内置的open、io.open、codecs.open复制。谢谢。我知道有三种新型的分线器。我将它们混合在一起是因为我想测试io.open如何以一种简单的方式处理它们。即使我只在一个文件中使用'\r',tell方法仍然返回错误的结果。
            import io

            with io.open('a', 'w') as fo: #this will be a windows format file
                fo.write(u'abc\n')
                fo.write(u'def\n')
                fo.write(u'hij')
                fo.write(u'klm')


            print('*io.open rb*')
            with io.open('a', 'rb') as fo:
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))

            print('*io.open rt*')
            with io.open('a', 'rt') as fo:
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))

            >>>

            *io.open rb*
            --'abc\r\n'--5
            --'def\r\n'--10
            --'hijklm'--16
            --''--16

            *io.open rt*
            --u'abc\n'--5
            --u'def\n'--10
            --u'hijklm'--16
            --u''--16
            >>>

            import io

            with io.open('a', 'wb') as fo: #this will be a unix format file
                fo.write(u'abc\n')
                fo.write(u'def\n')
                fo.write(u'hij')
                fo.write(u'klm')

            print('*io.open rb*')
            with io.open('a', 'rb') as fo:
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))

            print('*io.open rt*')
            with io.open('a', 'rt') as fo:
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))
                print('--%r--%d' % (fo.readline(), fo.tell()))

            >>>
            *io.open rb*
            --'abc\n'--4
            --'def\n'--8
            --'hijklm'--14
            --''--14

            *io.open rt*
            --u'abc\n'--4
            --u'def\n'--8
            --u'hijklm'--14
            --u''--14
            >>>