gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:50 27 4
gpt4 key购买 nike

试图在读取一行后使用tell() 获取光标位置。 text mode\r 似乎有问题。我是在滥用该方法还是它是一个错误?谢谢。

用 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

最佳答案

文本文件中的EOL(End of line)分为三种:

  • window :\r\n
  • unix (linux):\n
  • 苹果电脑:\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
>>>

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

关于Python stream.tell() 返回不正确的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24481276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com