在文本文件中查找换行符

3

我有一个任务要求创建一个tail,用于在文件中查找最后的K行。我们已经提供了一个缓冲区来使用。目前,我正在尝试编写小程序并在文件中搜索"\n"字符。但是我遇到了一些问题。在python中,我的代码返回6,而在python3中返回0。但是文本文件实际上包含了更多的内容。请问有人可以告诉我这为什么不像我想象的那样工作吗?

def new():
    try:
        f = open("test.txt", "r")
        count = 0
        for i in f:
            if i == "\n":
                count = count + 1
        return count
        f.close()
    except(FileNotFoundError):
        print("No file")      

我想做的是使用seek在文件中向后移动,然后定期搜索新行字符,但是这似乎对我没有用。


1
for i in f 在文件中迭代的是行而不是字符。 - sytech
@Gator_Python 谢谢。我曾以为一个for循环会遍历文件中的每个字符。谢谢。 - user6850989
3个回答

4

for i in f:并不能实现你想要的功能。文件的默认迭代器提供的是,而不是字符。因此,你现在正在检查“整个行是否只等于一个回车符?”

相反,尝试使用if i[-1] == "\n":,这表示“该行的最后一个字符是换行符吗?”

你可能会注意到这是微不足道的真实性,因为每一行都以换行符结束,所以简单地计算行数就足够了。


如果你想要遍历每个字符,我建议这样做:

for line in file:
    for char in line:
        dostuff()

将变量命名为你认为它们是什么也有助于故障排除,如果它们最终并不是你所想的那样。
例如在 repl.it 上的示例。变量被命名为linechar,只是为了展示它们是什么,它们可以很容易地被命名为 bananahenry,但是这样做 less clear what was happening. raven 为此示例模拟文件。

谢谢。我以为当你遍历一个文件时,它会处理文件中的每个字符。-1索引的效果非常好。是否有一种方法可以遍历每个字符,还是必须像打开(<file>, "rb")来读取位(bit)这样做? - user6850989
@DirtyDaver 我更新了代码,包括如何扫描文件中的字符。 - TemporalWolf
所以"char"是内置于语言中的,这将允许我逐个字符进行迭代? - user6850989
@DirtyDaver 不,我将它命名为“char”,因为这就是它所代表的。line是一个字符串,在Python中,如果你用for george in string进行循环,每次循环george都会得到一个单个字符。这只是for x in y在文件和字符串中的工作方式。 - TemporalWolf

1
为什么不简化逻辑,使用Python内置的功能呢?
def new(): # not a good function name!
    try:
        with open('data1.txt') as f:
            return f.read().count('\n')
    except FileNotFoundError:
        print ("No file")

通常,作业要求你自己完成。如果只给出了一行的列表推导式,他们可能会(理所当然地)认为这不是他自己写的,尽管那是我默认的方法。 - TemporalWolf
@TemporalWolf 是正确的,即使我们知道更多,我们也只能使用我们所学到的。不过我确实喜欢这种方法,并会牢记在心。谢谢你的回复。我只是写了一个名为new()的函数,只是为了在将其添加到我的代码并给它一个像GetCharacters()这样的函数名之前测试一下。 - user6850989

0

一个更简单的方法是

  • 使用Python内置的将文件拆分为行列表的能力
  • 从该列表的最后K个元素创建你的尾部

如果将整个文件保存在数组中成为问题,你可以逐行读取文件,但只保留最后读取的K行,这样当你到达文件末尾时,你就拥有了想要的尾部。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接