Python 的 tell() 在当前文件位置上行为不同

2 投票
4 回答
853 浏览
提问于 2025-04-16 12:53

在书籍《核心Python编程》中,有一个例子 -

>>> f = open('/tmp/x', 'w+')
>>> f.tell()
0
>>> f.write('test line 1\n')  # add 12-char string [0-11]
>>> f.tell()
12
>>> f.write('test line 2\n')  # add 12-char string [12-23]
>>> f.tell()                  # tell us current file location (end))
24

当我在我的解释器中运行相同的代码时,我得到的是13L代替12,26L代替24。 我在Windows上运行的是Python 2.5。

关于版本的行为或tell()函数,有什么变化吗?tell()是怎么决定文件中的位置的?

谢谢,祝好

4 个回答

0

在编程中,有时候我们需要在代码里使用一些特定的符号或者字符。这些符号可能会影响代码的运行,或者让代码变得难以理解。为了避免这些问题,我们可以使用转义字符。转义字符就是在某些字符前面加上一个特定的符号,通常是反斜杠(\),这样编程语言就知道我们是想要使用这个字符,而不是把它当作代码的一部分。

比如说,如果我们想在代码中使用一个引号("),但又不想让它被当作字符串的结束符号,我们就可以在引号前面加上反斜杠,变成\"。这样,编程语言就会把它当作普通字符处理,而不是结束字符串。

总之,转义字符帮助我们在代码中安全地使用一些特殊符号,让代码更清晰,也避免了潜在的错误。

>>> f = open('c:\\temp\\foo', 'w+')
>>> f.tell()
0L
>>> f.write('test line 1\n')
>>> f.tell()
13L
>>> g = open('c:\\temp\\bar', 'wb+')
>>> g.tell()
0L
>>> g.write('test line 1\n')
>>> g.tell()
12L
>>> 
1

这是因为在Windows系统中,换行符是由两个字符组成的,分别是CR和LF。而在Unix系统中,换行符只有一个字符,就是LF。默认情况下,Python会把\n转换成你操作系统所使用的换行符。

你看到的L只是表示这个数字是一个长整型,也就是比普通整数能表示更大范围的数字。

3

你的文件是以文本模式打开的。在这种模式下,Windows上的Python会在Windows的换行符和Unix的换行符之间进行转换。在Windows中,换行符由两个字符组成,而在Unix中,换行符只有一个字符('\n'),所以你看到的结果是正常的。

如果你以二进制模式打开文件,就不会有这些转换了。

f = open('/tmp/x', 'wb+')

这样你从tell()得到的结果也会是12和24。

撰写回答