【问题标题】:How to treat the first line of a file differently in Python?如何在 Python 中区别对待文件的第一行?
【发布时间】:2009-09-30 06:46:59
【问题描述】:

我经常需要处理第一行包含标题的大型文本文件。标头的处理方式通常与文件主体不同,或者我对主体的处理取决于标头。无论哪种方式,我都需要将第一行视为特例。 我可以使用简单的行迭代并设置一个标志:

headerProcessed = false
for line in f:
    if headerProcessed:
        processBody(line)
    else:
        processHeader(line)
        headerProcessed = true

但我不喜欢循环中的一个测试,除了它执行的数百万次之外,它是多余的。有没有更好的办法?我可以不同地对待第一行然后让迭代从第二行开始吗?我应该被打扰吗?

【问题讨论】:

    标签: python file iteration


    【解决方案1】:

    你可以:

    processHeader(f.readline())
    for line in f:
        processBody(line)
    

    【讨论】:

    • 谢谢格雷格。这正是我期望能够做到的,但不知何故假设文件位置将在 for 循环开始时被重置。 Python 经验教训:期待简单的方法奏效!
    • 另一个要学习的课程:测试你的假设。您本可以尝试并发现,但我们都不会从这种有趣的交流中受益!
    • 上述方法有效,但通常您可能会得到:ValueError: Mixing iteration and read methods would lose data
    【解决方案2】:
    f = file("test")
    processHeader(f.next()) #or next(f) for py3
    for line in f:
        processBody(line)
    

    这行得通。

    编辑:

    .__next__ 更改为next(它们 等效,但我想下一个更简洁)。

    关于file vs openfile 对我来说似乎更清楚,因此我将继续更喜欢它而不是open

    【讨论】:

    【解决方案3】:

    使用 iter()

    it_f = iter(f)
    header = it_f.next()
    processHeader(header)
    
    for line in it_f:
        processBody(line)
    

    它适用于任何可迭代的对象。

    【讨论】:

    • 我认为“iteratorable”很可爱。
    【解决方案4】:

    第一行带有标题的大文本文件?所以它是表格数据。

    只是为了确保:您查看过csv 模块吗?它应该处理所有表格数据,除了那些字段没有分隔但由位置定义的数据。它也做标题的事情。

    【讨论】:

    • 感谢 Lennart,是的,我经常使用出色的 csv 模块。
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2020-05-15
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多