如何在python

时间:2017-09-02 14:55:40

标签: python regex

我需要在文件中搜索类似(错误,警告,严重性)的模式,此文件将位于特定文件夹中(例如D:\express\abc_xyz_9.0_12_9_17_23_11.log),此处的问题是每次安装时软件,文件将根据系统的日期和时间生成,因此我无法对文件名进行硬编码,我需要编写正则表达式来查找文件名并打开它并搜索模式,这是代码,我试过,但它抛出一个错误

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)

3 个答案:

答案 0 :(得分: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

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

或更简单地只需将os.chdir的当前工作目录更改为"D:\express"

import os

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

我个人认为更改目录更整洁。

希望这有帮助!

答案 1 :(得分:0)

导致此错误是因为您正在尝试测试python(似乎没有在任何地方定义)是否位于目录D:\ Express中的文件列表中。 os.listdir()返回一个列表。如果你想打印出那个列表中的项目&#34; python&#34;在文件名中,你可以试试这个:

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

答案 2 :(得分: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()