在Python中处理文本文件时,Tell()方法不可靠

在Python中处理文本文件时,Tell()方法不可靠,python,text-files,tell,Python,Text Files,Tell,在python中处理文本文件时,.tell()方法似乎不是很可靠。我试图使用这个方法来代替在其他编程语言中发现的EOF条件 出于各种原因,我不想使用For循环迭代文本文件,而是使用WHILE循环 下面是一些复制问题的代码。我已经包含了以随机方式生成test.txt文本文件的代码: 重新导入 从随机导入randint def文件长度行(f_名称): 打开(f_名称)作为f: 对于枚举(f)中的i,l: 通过 返回i+1 def文件名字符(f名称,带nls): 字符计数=0 打开(f_名称)作为f:

在python中处理文本文件时,.tell()方法似乎不是很可靠。我试图使用这个方法来代替在其他编程语言中发现的EOF条件

出于各种原因,我不想使用For循环迭代文本文件,而是使用WHILE循环

下面是一些复制问题的代码。我已经包含了以随机方式生成test.txt文本文件的代码:

重新导入
从随机导入randint
def文件长度行(f_名称):
打开(f_名称)作为f:
对于枚举(f)中的i,l:
通过
返回i+1
def文件名字符(f名称,带nls):
字符计数=0
打开(f_名称)作为f:
对于f中的行:
字符计数+=len(行)
如果使用_nls:
字符计数+=1
其他:
通过
返回字符计数
def微调(sut):
返回re.sub('+','',sut.strip())
#创建测试文件
打开(“test.txt”、“w”)作为f:
单词列表=(“贝蒂吃蛋糕,叔叔卖鸡蛋”*20)
单词列表[3]=“”
#对于范围内的num(len(单词列表)):
#如果randint(1,2)=1:
#单词列表[num]=“”
对于word\u列表中的word:
打印(word,file=f)
文件_to_read='test.txt'
#文件_to_read='Fibonacci Tree 01.log'
打开时(文件读取为“r”)为f:
计数=0
文件长度=文件长度字符(文件到读取,真)
文件长度行=文件长度行(文件到读取)
打印(f“文件中的行={file\u length\u Lines},文件中的字符={file\u length}”)
f、 搜索(0)
而f.tell()<文件长度:
计数+=1
text_line=f.readline()
打印(f“Line={count},”,end=“”)
打印(f“Tell={f.Tell()},”,end=“”)
打印(f“长度{len(text_行)}”,结束=”)
如果文本在['',\n']中有一行:
打印(计数)
elif trim(text_line).upper()[0]在“A E I O U”中。split():
打印(文本_行,结束=“”)
其他:
打印(计数)
此代码应始终输出如下内容:

Lines in file = 140, Characters in file = 897
Line = 1, Tell = 7, Length 6 1
Line = 2, Tell = 13, Length 5 Eats
Line = 3, Tell = 20, Length 6 3
...
Line = 138, Tell = 884, Length 6 Uncle
Line = 139, Tell = 891, Length 6 139
Line = 140, Tell = 897, Length 5 Eggs

Process finished with exit code 0
但相反,它主要输出的内容更像:

Lines in file = 140, Characters in file = 605
Line = 1, Tell = 7, Length 6 1
Line = 2, Tell = 18446744073709551630, Length 5 Eats

Process finished with exit code 0
您可以看到,在上面输出的最后一行,.tell()方法输出出了问题,没有在所有140行中循环

我正在寻找一种使.tell()方法正常工作的方法,或者以另一种方式检测EOF条件,从而生成一个WHILE循环


同样,在线找到的大多数建议都说“使用FOR循环进行迭代”。我不想这样做,因为各种各样的原因很难解释。(简单地说,由于我打算遵循嵌套的流程图,这将使我的原始代码的性质变得非常笨拙。)

由于文档声明
TextIOBase.tell()
返回的数字是不透明的,并且“通常不表示底层二进制存储中的字节数”。可能的解决方案是使用二进制文件,然后转换每一行(注意行的结尾)。这可能是一个已知的限制。我不知道你想做什么,但是tell()函数几乎肯定不适合你。谢谢@Paul Cornelius,我意识到这一点并问了你。希望有人能想出一个解决办法来检查EOF的状况。同时使用for循环,但会产生一些麻烦的重复代码。有多种方法可以检测EOF情况。读取流会自动执行此操作,如果文件处于EOF,则其各种读取函数将返回空字符串。正如我所说的,我不知道你想做什么,但是读/写文件是最常见的操作之一,Python标准库的设计使它变得简单,而不必求助于你在这里所做的那种低级的混乱。正如文档所述,
TextIOBase.tell()
返回的数字是不透明的“通常不表示基础二进制存储中的字节数”。可能的解决方案是使用二进制文件,然后转换每一行(注意行的结尾)。这可能是一个已知的限制。我不知道您想做什么,但tell()函数几乎肯定不会对你起作用。谢谢@Paul Cornelius,我意识到了这一点并问了。希望有人找到了一个解决方法来检查EOF条件。同时使用了一个for循环,但它会产生一些麻烦的重复代码。检测EOF条件有多种方法。Read流会自动执行此操作,如果文件处于EOF,它们的各种读取函数将返回一个空字符串。正如我所说的,我不知道您正在尝试做什么,但读取/写入文件是最常见的操作之一,Python标准库旨在使其变得简单,而不必求助于低级的混乱你在这里干什么。