我试图从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'
>>>
你能告诉我一些建议吗?
答案 0 :(得分:0)
问题在于:
fileName = str(os.path.join(path,dir,file))
您正尝试将路径,名称列表和名称列表加入路径。这没有任何意义。如果你查看你复制的示例代码,我很确定它正在加入路径和列表中的单个目录或文件,而不是路径加上两个列表。
特别是,您可能希望os.path.join(path, fileNames)
。
这可能看起来令人困惑,但那是因为你的变量名称令人困惑。将file
传递给join
会失败,因为file
尽管名称是一整个文件名列表,但传递fileNames
会有效,因为尽管有名称,它仍然只是单个文件名。
答案 1 :(得分:0)
file
是os.walk()所在目录中的所有文件的列表。如果只有一个文件,则它是一个元素的列表。
答案 2 :(得分:0)
dir
你很亲密,只有file
是一个列表,因此fileNames
。另一方面,{{1}}只是一个字符串。你不能加入一个列表作为一个参数的路径。