Python file.tell()是否给出奇怪的数字?

Python file.tell()是否给出奇怪的数字?,python,python-3.x,Python,Python 3.x,我正在windows 64位上使用Python 3.3.0 我有一个如下所示的文本文件:(见下面mediafire的下载链接) 我试图在文件中导航,因此我使用.tell()来确定我的位置。然而,当阅读如下所示的文件行时,我得到了一个非常奇怪的结果: f=open("test.txt") while True: a = f.readline() print("{} {}".format(repr(a),f.tell())) if a == "": br

我正在windows 64位上使用Python 3.3.0

我有一个如下所示的文本文件:(见下面mediafire的下载链接)

我试图在文件中导航,因此我使用
.tell()
来确定我的位置。然而,当阅读如下所示的文件行时,我得到了一个非常奇怪的结果:

f=open("test.txt")
while True:
    a = f.readline()
    print("{}    {}".format(repr(a),f.tell()))
    if a == "":
        break
结果是:

'hello\n'    7
'\n'    9
'-data1:blah blah blah blah blah blah blah blah blah blah blah blah blah blah bl
ah blah\n'    18446744073709551714
'\n'    99
'\n'    101
'-data2:blah blah blah blah blah blah blah blah blah blah blah\n'    164
'-data3: Empty\n'    179
'\n'    181
'-data4: Empty'    194
''    194
b'hello\r\n'    7
b'\r\n'    9
b'-data1:blah blah blah blah blah blah blah blah blah blah blah blah blah blah b
lah blah\r\n'    97
b'\r\n'    99
b'\r\n'    101
b'-data2:blah blah blah blah blah blah blah blah blah blah blah\r\n'    164
b'-data3: Empty\r\n'    179
b'\r\n'    181
b'-data4: Empty'    194
b''    194
三号线的18446744073709551714怎么了?虽然它看起来像是一个不可能的值,
f.seek(18446744073709551714)
是一个可以接受的值,显然它将我带到了第三行的末尾。不过,我似乎不明白为什么

编辑: 在二进制模式下打开不会对
tell()
造成任何问题:

结果是:

'hello\n'    7
'\n'    9
'-data1:blah blah blah blah blah blah blah blah blah blah blah blah blah blah bl
ah blah\n'    18446744073709551714
'\n'    99
'\n'    101
'-data2:blah blah blah blah blah blah blah blah blah blah blah\n'    164
'-data3: Empty\n'    179
'\n'    181
'-data4: Empty'    194
''    194
b'hello\r\n'    7
b'\r\n'    9
b'-data1:blah blah blah blah blah blah blah blah blah blah blah blah blah blah b
lah blah\r\n'    97
b'\r\n'    99
b'\r\n'    101
b'-data2:blah blah blah blah blah blah blah blah blah blah blah\r\n'    164
b'-data3: Empty\r\n'    179
b'\r\n'    181
b'-data4: Empty'    194
b''    194

test.txt文本文件可在此处下载,只有很小的194字节:

这是由UNIX样式的行结尾引起的一种有文档记录的行为:

返回文件的当前位置,如
stdio
ftell()

注意:在Windows上,
tell()
在读取带有Unix样式行结尾的文件时,可能返回非法值(在
fgets()
之后)。使用二进制模式 ('rb')来规避这个问题


上述文件摘自python2.7.4文件。python3的文档发生了一些变化,因为现在有一个处理I/O的类的层次结构,我找不到这些信息。你的测试表明,这种行为无论如何没有改变。另外,python3.3的源代码中有一个
XXX Windows支持,下面的注释可能不完整
tell
调用的函数之前


python中有一个与此相关的bug跟踪器,Catalin Iacob的最后评论是:

我试图复制这个,在我的磁盘上选择了一个文件,实际上我得到了一个 负数,但该文件有Unix行结尾。这是 记录于 所以可能那时没什么可做的

至于Armin在msg180145中的报告,尽管不是直观的, 这与ftell在Windows上的行为相匹配,如备注中所述 部分 . fileobjects上的tell()方法被显式记录为匹配 ftell行为:“返回文件的当前位置,如stdio的 ftell()。所以,尽管这根本不是直觉,但很可能 最好还是保持原样。tell()返回直观的非零值 在Python3和python2.7上使用“a”打开时的位置 io.open,所以它是为将来而固定的

所以它看起来像一个“wontfix”bug。有人可能会提出一个问题(对该问题进行了评论),因为python3文档中根本没有提到这个事实


根据python3的说法,它根本不使用
ftell()
,因此这似乎是另一个bug。此外,这个bug在python3.2.3中是不可复制的,可能是在修复这个bug时引入的(至少,这是我能找到的唯一一个在3.2.3和3.3之间实现
tell()
的变化)


上次编辑:根据模块文档,
tell
方法不返回自文件开始以来的字节数。返回的值是一个“不透明的数字”,这意味着您可以使用它的唯一方法是将其传递到
seek
以返回该位置。其他操作没有意义。在python3.2.3之前,返回的值是您所期望的,这只是一个实现细节


请注意,文档部分中的信息完全是错误的,希望将来可以修复。

Uhh,等等,文本文件只是使用记事本创建的。使用notepad2显示了行结束符,我看到了CR+LF,哪个是窗口行结束符?Unix行结尾是否正确?显然,在修改了我的测试文件后,较长的行更有可能出现此问题。@Eric您是否尝试从python以二进制模式打开该文件并查看其内容?另外,你能把文件内容上传到某个地方吗?这样我们也可以进行测试?AFAIK mine是唯一合理的解释,我坚信python的文件是正确的,所以我仍然认为问题只是对
ftell()
的底层调用返回了垃圾。我用同样的东西在二进制模式下编辑了原始问题,并在mediafire中上传了文本文件。@Eric这是一个新的错误。请参阅更新的答案和与bug跟踪器相关的问题。@Eric,好的。根据python的开发人员的说法,这不是一个bug<代码>告诉根本不符合你的想法。更新了答案。