循环遍历Python中的文件夹和包含字符串的文件

时间:2015-08-06 22:14:55

标签: python

我是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;在它。

我提前感谢你的帮助。

2 个答案:

答案 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是当前目录,dirsfiles是目录和文件分别位于根目录中。请注意,它们是名称,而不是路径;或者确切地说,它们是目录/文件 relative 到当前根目录的路径,这是另一种说法相同的方式。另一种思考方式是dirsfiles中的目录和文件永远不会有斜杠。

最后一点;根目录路径始终以您传递给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。