使用 python 如何从目录和子文件夹中的所有文件中查找字符串
with python how to find a string from all files in a directory and subfloders
我正在尝试从 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'
>>>
你能给我一些建议吗?
问题出在这里:
fileName = str(os.path.join(path,dir,file))
您正在尝试将路径、名称列表和名称列表连接到路径中。那没有任何意义。如果您查看复制的示例代码,我很确定它是在连接路径和列表中的单个目录或文件,而不是路径加上两个列表。
特别是,您可能想要 os.path.join(path, fileNames)
。
这可能看起来令人困惑,但那是因为您的变量名称令人困惑。将 file
传递给 join
会失败,因为 file
是一个完整的文件名列表,而传递 fileNames
是可行的,因为尽管有名称,它只是单个文件名。
for 语句中的 file
是 os.walk() 所在目录中所有文件的列表。如果只有一个文件,则它是一个元素的列表。
import os
for path,dir,file in os.walk("."):
for fileNames in file:
if fileNames.endswith("json"):
fileName = str(os.path.join(path,fileNames))
print(fileName)
你很接近,只是 dir
是一个列表,file
也是。 fileNames
另一方面只是一个字符串。你不能加入一个带有列表的路径作为一个参数。
我正在尝试从 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'
>>>
你能给我一些建议吗?
问题出在这里:
fileName = str(os.path.join(path,dir,file))
您正在尝试将路径、名称列表和名称列表连接到路径中。那没有任何意义。如果您查看复制的示例代码,我很确定它是在连接路径和列表中的单个目录或文件,而不是路径加上两个列表。
特别是,您可能想要 os.path.join(path, fileNames)
。
这可能看起来令人困惑,但那是因为您的变量名称令人困惑。将 file
传递给 join
会失败,因为 file
是一个完整的文件名列表,而传递 fileNames
是可行的,因为尽管有名称,它只是单个文件名。
file
是 os.walk() 所在目录中所有文件的列表。如果只有一个文件,则它是一个元素的列表。
import os
for path,dir,file in os.walk("."):
for fileNames in file:
if fileNames.endswith("json"):
fileName = str(os.path.join(path,fileNames))
print(fileName)
你很接近,只是 dir
是一个列表,file
也是。 fileNames
另一方面只是一个字符串。你不能加入一个带有列表的路径作为一个参数。