Python stream.tell()返回错误的位置

时间:2014-06-29 23:47:17

标签: 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*')
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()))

输出:(不确定 340282367000166625996085689099021713421 是什么)

*io.open rb*
--b'abc\n'--4
--b'def\r\n'--9
--b'hij\rklm'--16
--b''--16
*io.open rt*
--'abc\n'--4
--'def\n'--9
--'hij\n'--340282367000166625996085689099021713421
--'klm'--16

1 个答案:

答案 0 :(得分:1)

文本文件中有三种类型的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
            >>>

你可以看到结果总是一样的,没有那个奇怪的长号