簡體   English   中英

Python-如果符合條件則關閉文件

[英]Python - closing a file if it meets a condition

我正在嘗試執行一個程序,其中程序通過目錄,依次打開每個文件,並在其他之前檢查特定行。 如果該行符合特定條件(即,它與目錄中任何其他文件中的該行都不匹配),則該文件將關閉,程序將移至下一個文件。

aps = []

import os
for filename in os.listdir("C:\..."):
    f = open(filename,"r")
    (f.readline())
    (f.readline())
    ap = (f.readline())
    ap = ap.rstrip("\n")
    aps.append(ap)
    freqs = {}
    for ap in aps:
        freqs[ap] = freqs.get(ap, 0) + 1
    for k, v in freqs.items():
        if v == 2:
            f.close()
        else:

對於“ else:”,我最初嘗試使用“ f.seek(0)”,但遇到了Python無法處理關閉文件的錯誤。 然后,我再次嘗試了'f = open(filename,“ r”)',但是這樣做有些奇怪,因為當我嘗試通過此方法打印第一行時,它會在瘋狂的循環中將其發送並多次打印該行。

這是完成此任務的最佳方法嗎? 如果沒有,我如何使它工作?

非常感謝。

不要有條件地關閉文件。 對打開的文件執行所需的操作,然后最后將其關閉。 使用with構造,文件將自動關閉:

for filename in os.listdir(path):
    with open(filename) as f:
        # do processing here
        if positive_condition:
            # do more processing

這就是您的代碼失敗的原因。 您在外部for循環之外初始化aps列表,因此它將包含您循環遍歷的所有文件中的指定行。 然后,您打開的每個文件的freqs詞典都會重置為空。

所以這些行:

for ap in aps:
    freqs[ap] = freqs.get(ap, 0) + 1

循環瀏覽到目前為止已讀取的每一行,並計算頻率。 問題出在內部for循環中:

for k, v in freqs.items():
    if v == 2:
        f.close()

此處發生的情況是, freqs具有一組密鑰,該密鑰可能與到目前為止循環的文件數量一樣大,並且您正在循環瀏覽每個密鑰。 因此,第一次鍵的值為2時,當前文件將關閉。 但是隨后循環繼續,因此下一次鍵的值為2時,python嘗試關閉文件,但該文件已關閉。

最簡單的解決方法是在f.close()之后添加一個break 但是,有更好的方法來構造此代碼。

一種方法是始終使用with命令打開文件,除非您有充分的理由這樣做。 所以:

with open(filename,"r") as f:
    #code

這樣,完成處理后文件將自動關閉。

我假設您循環瀏覽文件的順序並不重要,並且您希望頻率測試包括所有文件,而不只是到目前為止已打開的文件。 在這種情況下,遍歷兩次可能更容易,一次是匯編頻率指令,第二次是對滿足頻率要求的文件執行您想做的任何事情。

aps = []
freqs = {}
# First loop to read the important line from all files
for filename in os.listdir("C:\..."):
    with open(filename,"r") as f:
        f.readline()
        f.readline()
        ap = f.readline().rstrip("\n")
        aps.append(ap)
# Populate the dictionary
for ap in aps:
    freqs[ap] = freqs.get(ap, 0) + 1
# Second loop to handle the important cases
for filename in os.listdir("C:\..."):
    with open(filename,"r") as f:
        f.readline()
        f.readline()
        ap = f.readline().rstrip("\n")
        if freqs[ap] != 2:
            #do whatever

我強烈懷疑有更高效,更Python化的方法可以到達那里,但這是我的最佳想法。

暫無
暫無

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

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