使用python如何从目录和子载体中的所有文件中查找字符串

时间:2018-03-07 09:52:38

标签: python os.walk

我试图从aws cloudtrail日志中找到哪些文件包含“RunInstances”,使用grep我可以轻松运行此命令来查找: grep -r“RunInstances”*

但我想尝试使用python,我尝试过os.walk,而且出了点问题:

john@john-HP-ProBook-4411s:~/Downloads$ python
Python 2.7.12 (default, Nov 20 2017, 18:23:56)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> for path,dir,file in os.walk("."):
...     for fileNames in file:
...             if fileNames.endswith("json"):
...                     fileName = str(os.path.join(path,dir,file))
...                     print(fileName)
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
  File "/usr/lib/python2.7/posixpath.py", line 68, in join
    if b.startswith('/'):
AttributeError: 'list' object has no attribute 'startswith'
>>>
你能告诉我一些建议吗?

3 个答案:

答案 0 :(得分:0)

问题在于:

fileName = str(os.path.join(path,dir,file))

您正尝试将路径,名称列表和名称列表加入路径。这没有任何意义。如果你查看你复制的示例代码,我很确定它正在加入路径和列表中的单个目录或文件,而不是路径加上两个列表。

特别是,您可能希望os.path.join(path, fileNames)

这可能看起来令人困惑,但那是因为你的变量名称令人困惑。将file传递给join会失败,因为file尽管名称是一整个文件名列表,但传递fileNames会有效,因为尽管有名称,它仍然只是单个文件名。

答案 1 :(得分:0)

for语句中的

file是os.walk()所在目录中的所有文件的列表。如果只有一个文件,则它是一个元素的列表。

答案 2 :(得分:0)

dir

你很亲密,只有file是一个列表,因此fileNames。另一方面,{{1}}只是一个字符串。你不能加入一个列表作为一个参数的路径。