我是python的新手。 我需要遍历给定目录的子目录并返回包含特定字符串的所有文件。
for root, dirs, files in os.walk(path):
for name in files:
if name.endswith((".sql")):
if 'gen_dts' in open(name).read():
print name
这是我得到的最接近的。
我得到的语法错误是
Traceback (most recent call last):
File "<pyshell#77>", line 4, in <module>
if 'gen_dts' in open(name).read():
IOError: [Errno 2] No such file or directory: 'dq_offer_desc_bad_pkey_vw.sql'
&#39; dq_offer_desc_bad_pkey_vw.sql&#39;文件不包含&#39; gen_dts&#39;在它。
我提前感谢你的帮助。
答案 0 :(得分:9)
您之所以收到该错误,是因为您尝试打开name
,这只是文件的名称,而不是完全相对路径。你需要做的是open(os.path.join(root, name), 'r')
(我添加了模式,因为它是一种很好的做法)。
for root, dirs, files in os.walk(path):
for name in files:
if name.endswith('.sql'):
filepath = os.path.join(root, name)
if 'gen_dts' in open(filepath, 'r').read():
print filepath
os.walk()
返回一个生成器,它为您提供(root, dirs, files)
之类的元组,其中root
是当前目录,dirs
和files
是目录和文件分别位于根目录中。请注意,它们是名称,而不是路径;或者确切地说,它们是目录/文件 relative 到当前根目录的路径,这是另一种说法相同的方式。另一种思考方式是dirs
和files
中的目录和文件永远不会有斜杠。
最后一点;根目录路径始终以您传递给os.walk()
的路径开头,无论它是否与您当前的工作目录相关。因此,对于os.walk('three')
,第一个元组中的root
将为'three'
(对于os.walk('three/')
,它将为'three/'
)。对于os.walk('../two/three')
,它将是'../two/three'
。对于os.walk('/one/two/three/')
,它将是'/one/two/three/'
;第二个可能是'/one/two/three/four'
。
答案 1 :(得分:0)
文件只是文件名。您需要在打开它们之前添加路径。使用os.path.join。