2017-09-02 33 views
0

我需要在文件中搜索像(錯誤,警告,嚴重等)模式,該文件將位於特定文件夾中(例如D:\express\abc_xyz_9.0_12_9_17_23_11.log),問題這裏是每一次,當我安裝軟件時,文件將根據系統的日期和時間生成,所以我不能硬編碼文件名,我需要編寫一個正則表達式來查找文件名並打開它和搜索模式,這裏是代碼,我都試過了,但它拋出一個錯誤如何在Python中使用正則表達式打開文件

TypeError: expected str, bytes or os.PathLike object, not list 

請從下面來檢查我的代碼,

import os 

path = os.listdir("D:\Express") 
print(path) 
with open(path) as f: 
    for line in f: 
     if python in f: 
      print (line) 
+1

'listdir',毫不奇怪,給你一個*列表*。你不能一次打開整個列表,也許試着迭代它? – jonrsharpe

+1

使用glob模塊進行模式匹配文件。 – Mike

回答

0

此錯誤是由於您試圖測試python(它似乎沒有在任何地方定義)是否位於目錄D:\ Express中的文件列表中導致的。 os.listdir()返回一個列表。如果你想打印出該名單,其中「蟒蛇」在文件名中的項目,你就可以試試這個:

directory_list = os.listdir("D:\Express") 
for filename in directory_list: 
    if "python" in filename: 
     print (filename) 

你的問題是關於嘗試使用這個正則表達式,但我不」我認爲這是簡單搜索所需要的。

順便說一句。我通常使用glob.glob來表達你正在談論的內容https://docs.python.org/2/library/glob.html

0

你必須迭代os.listdir()中的文件。你可以這樣說:

import os 

files = os.listdir('D:\express') 
for file in files: 
    f = open(os.path.join('D:\express\\', file)) 
    for line in f: 
     if 'Error' in line or 'Warning' in line or 'Severity' in line: 
      print(line) 
    f.close() 
+0

你不能簡單地用'file in line:'作爲'file'只是文件的名字,而不是它的內容。所以這實際上會循環遍歷文件名字符串中的字符而不是文件中的每一行...... –

+0

是的,我忘記打開該文件,感謝您注意 – campovski

1

os.listdir()返回一個list ...

當使用open()打開一個文件,你需要提供一個路徑到file - 不是list 。這是什麼導致你的錯誤。

如果我理解正確的,你想要的是loop通過在該目錄中(讓他們與os.listdir())的文件和每個文件檢查,如果任何行包含「錯誤」,「警告」或「嚴重」。

要做到這一點,你可以不喜歡,如果該文件是在當前工作目錄:

import os 

for file in os.listdir(): 
    with open(file) as f: 
     for line in f: 
     if 'Error' in line or 'Warning' in line or 'Severity in line: 
      print('the line was', line) 
      print('the file was', file) 

上面的代碼是相當不言自明的,從本質上講,你遍歷目錄中的每個文件,打開該文件爲'f'。然後,對於文件'f'中的每一行,只需檢查'Error','warning''Severity'是否在該行中。

在這裏的代碼,它只是簡單地打印行和包含文件,但當然,如果你想存儲這些或與他們做別的事情,你可以。

更新:

我認爲錯誤的事實的文件不在當前工作目錄,以便您通過在目錄中的文件名,而不是路徑文件循環來了。因此,當您嘗試執行open(file)時,它不起作用,因爲它在當前目錄中搜索您正在運行程序的文件名稱,而不是從文件路徑"D:\express\abc_xyz_9.0_12_9_17_23_11.log"打開。

爲了解決這個問題,你可以做使用os.path.join

import os 

os.chdir("D:\express") 
for file in os.listdir(): 
    ... 

我個人認爲,改變目錄是整潔:

for file in os.listdir("D:\express"): 
    with open(os.path.join("D:\express", "file")) as f: 
     ... 

或者更簡單地只是os.chdir"D:\express"改變當前的工作目錄。

希望這會有所幫助!

+0

HI Joe,非常感謝您的明確解釋:) ..當我執行我的程序使用你給的代碼,它給錯誤爲「FileNotFoundError:[Errno 2]沒有這樣的文件或目錄:'abc_xyz_9.0_12_9_17_23_11.log'」,即使文件是存在的,它是拋出這個錯誤。 –

+0

如果你只是運行'open(「abc_xyz_9.0_12_9_17_23_11.log)」)' –

+0

會發生什麼?我不想硬編碼文件名,因爲在每次安裝後,文件名會被更新爲新的日期和時間。 –

相關問題