[英]Python: Write an entire file to another file after a specific line that meets a particular condition
[英]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.