【问题标题】:How can I get python to read every nth line of a .txt file? [duplicate]如何让 python 读取 .txt 文件的每一行? [复制]
【发布时间】:2017-11-01 19:41:49
【问题描述】:

如果我想让 python 读取文件的每 2 行(或每 4 行),我怎么能告诉它这样做呢?此外,如果我想读取 .txt 文件的第 2 行,但之后每 4 行(下一行是第 6 行,然后是第 10 行,以此类推),我该如何做到这一点?

【问题讨论】:

    标签: python loops for-loop


    【解决方案1】:

    你不能... [使用纯 I/O 函数来做] 你必须阅读所有行,然后简单地让你的代码忽略你不需要的行。

    例如:

    with open(filename) as f:
        lines = f.readlines()
    desired_lines = lines[start:end:step]
    

    在上面的代码中,将 start、end 和 step 替换为所需的值,例如 "...如果我想读取 .txt 文件的第 2 行,但之后每 4 行..." 你会这样做:

    desired_lines = lines[1::4]
    

    【讨论】:

    • 由于以下声明而被否决:“您必须阅读所有行,并简单地让您的代码忽略您不需要的行”。不正确也没有必要,请在此处查看其他答案...这会创建 两个 不必要的列表
    【解决方案2】:

    聚会有点晚了,但这里有一个不需要一次将整个文件内容读入 RAM 的解决方案,这在处理足够大的文件时可能会造成麻烦:

    # Print every second line.
    step = 2
    with open("file.txt") as handle:
        for lineno, line in enumerate(handle):
            if lineno % step == 0:
                print(line)
    

    文件对象 (handle) 允许遍历行。这意味着我们可以逐行读取文件,而无需累积所有行。要选择每 n 行,我们使用带有当前行号和所需步长的模运算符。

    【讨论】:

    • 对于从第 2 行开始,每 4 行获取一次的第二个示例,这将失败。您可能希望乘坐第 6 行,但 6 % 4 != 0...
    【解决方案3】:

    您可以先将open file 作为f 使用with 语句。然后,您可以使用 Python 的 slicing 表示法通过 file 中的每个 line iterate。

    如果我们采用f.read(),我们会在每个line 的末尾得到一个带有new-line (\n) 字符的string:

    "line1\nline2\nline3\n"
    

    所以要将其转换为lines 的list,以便我们可以slice 获取其他line,我们需要在每次出现\n 时split:

    f.read().split()
    

    上面的例子会给出:

    ["line1", "line2", "line3"]
    

    最后,我们需要得到每个其他的line,这是通过slice [::2] 完成的。我们从slicing 的工作方式知道这一点:

    list[start : stop : step]
    

    使用所有这些,我们可以编写一个for-loop,它将iterate 贯穿其他line:

    with open("file.txt", "r") as f:
        for line in f.read().split("\n")[::2]:
            print(line)
    

    【讨论】:

    • 我不知道为什么你的回答被否决了,但我可以向你保证这不是我。
    • @AGNGazer 不用担心,我没有指责任何人,我只是想看看有人认为对此没有什么用处……没有评论的反对票没有多大帮助跨度>
    • 可能是因为这会将整个文件读入字符串而不是逐行迭代文件...
    【解决方案4】:

    解决这个问题的另一种方法,

    def readFile(lineNo):
        with open("read.txt", "r") as ins:
            array = []
            for line in ins:
                array.append(line)
            for i in range(1, len(array)):
                print(array[i*lineNo - 1])
    readFile(2)
    

    希望这会有所帮助!

    【讨论】:

    • Python 不使用arrays,它使用lists,这根本行不通……
    • 您还需要在function 定义的末尾和对function 的调用之间留一个空格...
    • 只是变量名,你试过执行这段代码吗?
    • 是的,它在很多方面都失败了......而且我知道它只是一个variable 的名字,但它只是表明缺乏理解,仅此而已。
    • 好吧,即使您在调用函数之前留下一行,它也会给出IndexError。这是因为您要将file 中的所有行添加到list,然后将iterating 添加到此list 中的每个index。然后,您尝试从 index 的列表中获取值乘以输入。这意味着除非输入是1,否则您将尝试在列表中获取一个超出末尾的元素——给出IndexError。您可以通过将第二个for-loop 转到len(array)/lineNo 来修复错误。尽管如此,atm 你的代码并不像我说的那样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2017-02-12
    相关资源
    最近更新 更多