我在Windows 64位上使用Python 3.3.0。
我有一个文本文件,如下所示:(请参阅底部的mediafire下载链接)
hello
-data1:blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah
-data2:blah blah blah blah blah blah blah blah blah blah blah
-data3: Empty
-data4: Empty
我正在尝试浏览文件,因此我.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
第三行的18446744073709551714是怎么回事?尽管它看起来像一个不可能的值,f.seek(18446744073709551714)
但显然是可以接受的值,确实使我到达了第三行的结尾。虽然,我似乎无法弄清楚为什么。
编辑:在二进制html" target="_blank">模式下打开不会出现任何问题tell()
:
f=open("test.txt","rb")
while True:
a = f.readline()
print("{} {}".format(repr(a),f.tell()))
if a == b"":
break
结果:
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个字节:http
:
//www.mediafire.com/?1wm4lujb2j48y23
这是由UNIX样式的行尾引起的已记录的行为:
file.tell()
返回文件的当前位置,喜欢
stdio
的ftell()
。注意
:在Windows上,当读取带有Unix样式的行尾的文件时,tell()
可以返回非法值(在后面fgets()
)。使用二进制模式(’rb’)可以避免此问题。
以上文档取自python2.7.4文档。python3的文档有所更改,因为现在有了处理I /
O的类层次结构,而我找不到这些信息。您的测试表明该行为始终没有改变。同样,python3.3的源代码在调用XXX Windows support below is likely incomplete
的函数之前有一个注释tell
。
与此相关的python bug跟踪器中存在一个问题,Catalin
Iacob的最终评论是:
我试图重现此错误,在磁盘上选择了一个文件,确实得到了一个负数,但是该文件具有Unix行尾。在http://docs.python.org/2/library/stdtypes.html#file.tell中对此进行了记录,
因此,那时可能没有任何事可做。至于msg180145中Armin的报告,即使它不是很直观,也与ftell在Windows上的行为相匹配,如http://msdn.microsoft.com/zh-
cn/library/0ys3hc0b%28v=vs.100的“备注”部分所述。
%29.aspx。文件对象上的tell()方法已明确记录为与ftell行为匹配:“返回文件的当前位置,如stdio的ftell()”。因此,尽管它根本不直观,但最好还是保留它。tell()在python.3和io.open上在Python
2.7上以’a’打开时返回直观的非零位置,因此无论如何它在将来都是固定的。
因此,这似乎是一个“ wontfix”错误。
某人可能应该打开一个问题
(对此
问题进行了
评论),因为在python3文档中根本没有提到这个事实。
根据Antoine Pitrou的说法,
python3根本不使用ftell()
,因此这似乎是一个不同的错误。此外,该错误在python3.2.3中不可重现,并且可能是在解决此问题时引入的(至少,这是我只能tell()
在3.2.3和3.3之间实现的唯一更改)
上次编辑:根据io
模块文档,此tell
方法自文件开头以来
不
返回字节数。返回的值是“不透明数字”,这意味着使用它的唯一方法是将其传递给seek
该位置以返回该位置。其他操作没有意义。在python3.2.3之前返回的值就是您所期望的事实,但这只是实现细节。
请注意,本文档此部分中的信息完全是 错误的 ,希望将来会得到修复。
问题内容: 因此,当我在Java中使用Doubles进行加法或减法时,它会给我带来奇怪的结果。这里有一些: 如果我加上,它给了我。没错 如果我添加,它会给我(重复s 的数量可能会关闭)。错了 如果我减去,它就会给我(再次,重复的s可能会关闭)。错了 起初我以为这只是将双精度数与十进制值相加的问题,但我错了。以下工作正常: 现在,添加的第一个数字是保存为变量的双精度数,尽管第二个变量从捕获文本。例如
问题内容: 我似乎在数组上使用时发现了一个陷阱,但是我找不到解释。本质上,如果我尝试对一个大数组求和,那么我会开始得到荒谬的答案,但这是 无声的, 而且我无法充分理解输出结果,而不是Google的原因。 例如,这完全按预期工作: 为两者提供相同的输出: 但是,这不起作用: 提供以下输出: 在更大的阵列上,有可能获得正面的结果。这是更隐蔽的,因为我可能根本不知道发生了什么不寻常的事情。例如: 给出以
问题内容: 试图在LINQ查询(使用Entityframework)中实现条件创建了奇怪的查询。在某些情况下,即使阈值设置为180秒,这些查询也会超时: 使用一些不太优雅的if语句,我没有任何问题,查询在几秒钟内返回: 条件语句都是从查询字符串传递的,这就是为什么它们有时可能带有值而有时却没有值的原因。 使用三元运算符时会出现相同的问题 关于这些内联条件为何表现如此差的情况,是否有合理的解释? 问
我想用fsolve数值求解一个非线性超越方程的根。 下面的代码执行此任务。
本文向大家介绍PHP程序找出给定范围内的所有奇数的和,包括了PHP程序找出给定范围内的所有奇数的和的使用技巧和注意事项,需要的朋友参考一下 为了找到给定范围内的奇数之和,代码如下- 示例 输出结果 定义了一个名为“ odd_num_sum”的函数,该函数计算特定数字范围内的奇数之和。函数“ num_in_range”给出两个数字之间的值范围,这些数字作为参数传递给该函数。在这两个函数之外,都定义了
问题内容: 这段代码: 调用此方法: 给我一个ClassCastException->跟踪的一部分: 这很奇怪,因为,实际上,如果您查找Hibernate的源代码,它将尝试执行以下操作: 这没有任何意义… 目标的类型为Class,此代码尝试将其强制转换为Map, 为什么要尝试这样做??? 任何指针都值得欢迎… 我正在使用Hibernate 5(并且正在从3升级)… 编辑:我也使用Spring(4.