2017-09-02 170 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

会发生什么?我不想硬编码文件名,因为在每次安装后,文件名会被更新为新的日期和时间。 –

相关问题