簡體   English   中英

如何使用Python中的函數搜索文件中的特定行並將其寫入另一個文件

[英]How to search specific lines in a file and write them to another file, using function in Python

我的目標是建立一個日志解析器,該日志解析器將復制我想要的關鍵字之間的選定行並寫入文件。 由於我必須在單個文件中的多個關鍵字之間進行搜索,因此我考慮編寫一個函數並在腳本中多次使用它。

但是我無法通過以下腳本來實現此功能並出現錯誤:

import re

def myfunc (infile ,outfile, search1 , search2):

    fi =  infile.readlines()
    fo =  open(outfile, 'w')

    write1 = False
    for line in fi:
     if re.findall('search1' , str(line)):
        write1 = True
     elif re.findall('search2', str(line)):
        write1 = False
     elif write1:
        fo.write(line)

    fo.close()
    fi.close()

    return;

text_file = open(input("name of inputfile : "))
resultfile =  input("name of outputfile : ")

search1 = "teen"
search2 = "eight"
myfunc (text_file , resultfile , search1 , search2)

我收到以下錯誤:

Traceback (most recent call last):
  File "C:/Users/zoro/PycharmProjects/text-parsing/write selected test 2 sets.py", line 38, in <module>
    myfunc (text_file , resultfile , search1 , search2)
  File "C:/Users/zoro/PycharmProjects/text-parsing/write selected test 2 sets.py", line 28, in myfunc
    fi.close()
AttributeError: 'list' object has no attribute 'close'
fi = infile.readlines()

這使fi成為文件infile中的行列表。 因此,當您稍后調用fi.close() ,您嘗試關閉列表,這當然是行不通的。

相反,您需要關閉文件,即infile

infile.close()

通常,以某種方式更改變量名是一個好主意,這樣可以清楚地知道它們包含的內容。 infile是您從中讀取的文件對象,因此可以。 outfile是要寫入的文件的文件名 ,因此應將其命名為outFileName或其他名稱。 fiinfile中的行的列表,因此您應該將其inFileLines

您還應該避免必須手動關閉文件對象。 而是使用with語句確保它們自動關閉:

with open(outfile, 'w') as fo:
    fo.write('stuff')
    # no need to manually close it

最后,您的代碼還有另一個問題: re.findall('search1' , str(line))這將re.findall('search1' , str(line))搜索字符串'search1' 它不會尊重正在傳遞給函數和被存儲在所述值search1 (和search2 )變量。 因此,您需要在其中刪除引號: re.findall(search1, line) (您也不需要將行轉換為字符串)。

另外,如果僅評估re.findall()的真值,則不是最好的方法。 相反,使用re.search僅返回第一個結果(因此對於很長的行 ,如果您已經找到結果,則不會繼續搜索)。 如果search1以及search2將不包含實際正則表達式,但只是字符串要在網上找到,那么你也應該只使用in運營商:

if search1 in line:
    write1 = True

最后一點:文件句柄應始終從打開它們的同一級別關閉。 因此,如果您在函數內部打開文件句柄,則函數也應將其關閉。 如果您在函數外部打開文件,則該函數不應關閉它。 關閉文件是打開程序的責任,對於其他實例,關閉文件可能會導致錯誤的行為,因此,您不應該這樣做(除非已明確記錄,例如,函數doSomethingAndClose可能會關閉文件)。

使用with語句通常可以避免這種情況,因為您從不手動調用file.close() ,並且with語句已經確保了文件已正確關閉。

如果您想多次使用一個文件,則必須從頭開始才能再次讀取文件。 在您的情況下,由於您正在使用infile.readlines()將整個文件讀入內存,因此最好只從文件中讀取一次行,然后將其重新用於多個函數調用:

text_file = input("name of inputfile : ")
with open(text_file) as infile:
    fi = infile.readlines() # read the lines *once*

    myfunc(fi, …)
    myfunc(fi, …)
    myfunc(fi, …)

暫無
暫無

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

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