簡體   English   中英

如何在不更改迭代的情況下獲取for循環中文件中的下一行

[英]How to get next line in a file within a for loop without changing iteration

我正在做一個練習,它接收一個包含服務器機房溫度數據的文件,我想打印出所有年份的平均溫度。 所以我需要獲取文件中的下一行以確定下一年是什么。 我嘗試了 next() 但這會強制 for 循環到 go 到下一次迭代。 我需要第一行和第二行,然后移動到第二行並獲得第三行,等等。

這是代碼的一部分:

with open("THUMlog.txt", "r") as file:
for line in file:
    if line == "#DATE TIME TEMPERATURE UNIT HUMIDITY%\n":
        continue
    stripped_line = line.rstrip().split()
    next_line = next(file, "").rstrip().split()
    print(f"Stripped: {stripped_line}")
    print(f"Next: {next_line}")

Output 的部分(非常大的文件):

    Stripped: ['9/28/2010', '15:45:14', '22.248900', 'C', '44.721968']
Next: ['9/28/2010', '16:00:07', '22.738900', 'C', '50.539993']
Stripped: ['9/28/2010', '16:15:07', '23.388900', 'C', '49.339338']
Next: ['9/28/2010', '16:30:07', '23.918900', 'C', '47.539280']
Stripped: ['9/28/2010', '16:45:08', '23.668900', 'C', '40.700378']
Next: ['9/28/2010', '17:00:07', '23.438900', 'C', '40.130996']
Stripped: ['9/28/2010', '17:15:07', '23.188900', 'C', '40.546257']
Next: ['9/28/2010', '17:30:07', '23.038900', 'C', '40.361183']
Stripped: ['9/28/2010', '17:45:07', '22.978900', 'C', '40.356943']
Next: ['9/28/2010', '18:00:08', '22.808900', 'C', '40.239134']
Stripped: ['9/28/2010', '18:15:07', '22.748900', 'C', '40.329383']
Next: ['9/28/2010', '18:30:07', '22.588900', 'C', '40.347069']

所以基本上,第一個 Next 應該是與第二個 Stripped 相同的列表。 我嘗試將所有這些列表連接到一個列表中,這樣我就可以通過索引輕松地獲得下一個列表,但是我超過了時間限制可能是因為我有 2 個 for 循環,一個循環遍歷整個文件,將行拆分為一個列表,然后附加到另一個列表。 然后另一個循環遍歷列表列表。 這有效地使時間加倍。 這是我的編程課程中的一項額外練習,它是在運行和檢查您的解決方案的軟件中完成的。

您在循環和使用中都使用了單個迭代器next 這可能會讓人感到困惑。 想一想:

  • 在迭代iline是 line k並且next_line是 line k+1
  • 在迭代i+1時, line現在是行k+2

您需要在迭代之間傳遞/保存一行。 使用每行中連續數字的示例文件:

1
2
3
...

使用代碼:

with open("text.txt") as file:
    line = next(file)
    for next_line in file:
        print(line.strip())
        print(next_line.strip())
        print("---")
        line = next_line

會給:

1
2
---
2
3
---
3
4
---
...

您可以在每次迭代結束時的更新時單獨跟蹤上一行:

prev_line = None
with open("THUMlog.txt", "r") as file:
    for line in file:
        if line == "#DATE TIME TEMPERATURE UNIT HUMIDITY%\n":
            continue
        stripped_line = line.rstrip().split()
        if prev_line:
            print(f"Stripped: {prev_line}")
            print(f"Next: {line}")
        prev_line = line

先用數據讀取第一行,然后在循環中讀取 rest,同時跟蹤上一行。

with open("THUMlog.txt", "r") as file:
    previous_line = file.readline()
    if previous_line = "#DATE TIME TEMPERATURE UNIT HUMIDITY%\n":
        previous_line = file.readine()

    for current_line in file:
        # do whatever with current and previous lines
        previous_line = current_line

您可以通過在當前文件中倒帶 position 來執行此操作。

with open(...) as fh:
    pos = fh.tell() # This is where we want to go back to
    # Do what ever you want such as read lines.
    if INEEDTOGOBACK:
        fh.seek(pos)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM