尝试使用 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
答案 0 :(得分:1)
文本文件中有三种类型的EOL(行尾):
您必须使用正确格式的正确EOL。
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
>>>
你可以看到结果总是一样的,没有那个奇怪的长号