我需要在文件中搜索类似(错误,警告,严重性)的模式,此文件将位于特定文件夹中(例如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)
答案 0 :(得分:1)
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()