【问题标题】:finding new line characters in a text file在文本文件中查找换行符
【发布时间】:2017-02-28 01:18:31
【问题描述】:

我有一个任务涉及创建一个尾部以查找文件中的最后 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 在文件中倒退,并且经常搜索换行符,但这似乎对我不起作用。

【问题讨论】:

  • for i in f 迭代文件中的行,而不是字符。
  • @Gator_Python 谢谢。我认为 for 循环会遍历文件中的每个字符。谢谢。

标签: python file newline


【解决方案1】:

for i in f: 没有按照你的想法做。文件的默认迭代器为您提供lines,而不是characters。所以你的意思是“整条线等于返回吗?”

尝试改用if i[-1] == "\n":,因为它说“行中的最后一个字符是换行符吗?”

您可能会注意到这是微不足道的,因为每个“行”都以换行符结束,因此只需计算行数就足够了。


如果你想遍历单个字符,我会这样做:

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

将变量命名为您认为的名称也有助于解决问题,如果它们最终不是您的想法。


repl.it 上的示例。这些变量被命名为linechar 只是为了显示它们是什么,它们可以很容易地命名为bananahenry,尽管这样就不太清楚发生了什么。 raven 在本示例中模拟了一个文件。

【讨论】:

  • 谢谢。我认为当您遍历文件时,它会执行该文件中的每个字符。 -1 索引就像一个魅力。有没有这样一种方法可以遍历每个字符,或者您是否必须执行诸如 open(, "rb") 之类的操作才能读取位?
  • @DirtyDaver 我更新了它以包括我将如何扫描文件中的字符。
  • 所以语言中内置了“char”,这将允许我一次迭代 1 个字符?
  • @DirtyDaver 不,我将其命名为char,因为它代表了它的含义。 line 是一个字符串,在 python 中,如果你这样做 for george in string 每个循环 george 将有一个字符。这就是 for x in y 对文件和字符串的作用。
【解决方案2】:

一个更简单的方法是

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

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

【讨论】:

    【解决方案3】:

    为什么不简化逻辑并使用 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 是正确的,即使我们知道的更多,我们也只能使用我们所学的知识。不过,我确实喜欢这种方法,并将牢记这一点。感谢您的答复。我只写了函数 new() 只是因为我在实际将它添加到我的代码并给它一个函数名称(如 GetCharacters() 之类的东西之前尝试测试它)。
    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多