我在测试filestreams在Python中的工作原理,我写了一些代码如下:

with open('test2.txt') as f:
    while r := f.read(1):
        print(repr(r), f.tell(), sep='\tindex:', end='\n***************\n')

test2.txt内容如下:

012345

6789

我运行了代码,输出如下:

'0'     index:1
***************
'1'     index:2
***************
'2'     index:3
***************
'3'     index:4
***************
'4'     index:5
***************
'5'     index:18446744073709551623
***************
'\n'    index:8
***************
'\n'    index:10
***************
'6'     index:11
***************
'7'     index:12
***************
'8'     index:13
***************
'9'     index:14
***************

请有人帮助我理解为什么f.tell()返回18446744073709551623,以及为什么如果我们假设"5"得到索引6,为什么"\n"有索引8而不是7.先谢谢你.

推荐答案

Python文档提到,file. tell()方法在调用了file.read()或file. readline()之后返回一个未定义的值.在详细说明file. tell()方法的一节中特别提到了这一点.

在代码片段中,对f. tell()的调用紧接着发生在方法f.read(1)之后.因此,返回值是未定义的.为了得到预期的结果,请避免在f.read()或f. readlines()之后调用f. tell().

第二点关于索引为8而不是7的neline字符的第二点是因为neline字符(\n)在Python中被认为是单个字符,因此它在文件中占据了一个位置.它本质上是一个不可见的字符,表示一个断行.所以在5之后,新行字符'\n'位于索引6.然后f.tell()指向下一个字符的开始,这是文件中的另一个新行字符,因此索引8.

这与文件流的操作是一致的,其中索引是下一次写入将发生的位置,它正好在最后一个读取字符之后.看似"跳过"的索引7是由于换行字符"\n".

关于18446744073709551623的意外大索引,这可能是由于我之前提到的问题—在read()之后使用tell().这可能是一个bug或系统特定的问题.最好不要在读()之后立即依赖tell().

另见

Python file.tell() giving strange numbers?

Python file.tell gives wrong value location

Python相关问答推荐

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

Select 用a和i标签包裹的复选框?

连接两个具有不同标题的收件箱

根据在同一数据框中的查找向数据框添加值

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

scikit-learn导入无法导入名称METRIC_MAPPING64'

如何记录脚本输出

使用groupby Pandas的一些操作

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

pyscript中的压痕问题

如何使用表达式将字符串解压缩到Polars DataFrame中的多个列中?

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

比Pandas 更好的 Select

为什么t sns.barplot图例不显示所有值?'

为什么dict. items()可以快速查找?

操作布尔值的Series时出现索引问题

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子

ValueError:必须在Pandas 中生成聚合值