【问题标题】:Search directory for specific string搜索特定字符串的目录
【发布时间】:2013-01-20 13:54:50
【问题描述】:

我正在尝试搜索一个充满头文件的特定目录,并查看每个头文件,如果任何文件中有一个字符串“struct”,我只想让程序打印哪个文件有它。

到目前为止我有这个,但它不能正常工作,你能帮我弄清楚吗:

import glob
import os
os.chdir( "C:/headers" )
for files in glob.glob( "*.h" ):
    f = open( files, 'r' )
    for line in f:
        if "struct" in line:
            print( f )

【问题讨论】:

  • 究竟是什么不工作?
  • 请定义“工作不正常”
  • 它没有打印任何东西,即使我有很多带有行结构的 .h 文件。
  • 你在循环文件吗?:for line in f: print(line)
  • for 循环让您一次处理一个文件,因此应该是for file ...(单数,是的,我是在挑剔,但它有助于缓解思维压力。)其次,你应该在读完文件后关闭它。我推荐使用with 结构来自动关闭文件。第三,f是文件句柄,不是文件名(字符串),所以print file而不是print f

标签: python file directory


【解决方案1】:

这在我测试时有效:

for files in glob.glob( "*.h" ):
    f = open( files, 'r' )
    file_contents = f.read()
    if "struct" in file_contents:
            print f.name
    f.close()

确保打印f.name,否则打印的是文件对象,而不是文件本身的名称。

【讨论】:

  • 如果我错了,请纠正我,但这不会导致非空行上的无限循环,甚至不会循环文件中的所有行吗?
  • 对,有点问题,马上修复。
  • @akalIDIOT:我已经更新了,看起来可行吗?
  • 这与问题中的相同。他的问题不在文件迭代中
  • @Nate 如果不确定,请在本地自行测试...(并且,正如 RickyA 所说,这与 OP 的版本没有任何不同)
【解决方案2】:

您似乎对文件名感兴趣,而不是行,所以我们可以通过读取整个文件并搜索来加快速度:

...
for file in glob.glob('*.h'):
    with open(file) as f:
        contents = f.read()
    if 'struct' in contents:
        print file

使用with 构造可确保正确关闭文件。 f.read() 函数读取整个文件。

更新

由于原贴说他的代码没有打印,我建议插入调试行:

...
for file in glob.glob('*.h'):
    print 'DEBUG: file=>{0}<'.format(file)
    with open(file) as f:
        contents = f.read()
    if 'struct' in contents:
        print file

如果您没有看到任何以“DEBUG:”开头的行,那么您的 glob() 返回了一个空列表。这意味着您进入了错误的目录。检查目录的拼写以及目录的内容。

如果您看到“DEBUG:”行,但没有看到预期的输出,则您的文件中可能没有任何“结构”。首先 cd 到目录检查这种情况,然后发出以下 DOS命令:

find "struct" *.h

【讨论】:

  • 我假设'OP'=原始海报。有两件事:1. print(f) ==> f 是文件句柄,而不是文件名,2. 代码将多次打印同一个文件,每次出现“struct”。我的代码只打印一次文件名。
  • 是的,我知道了,但为什么他的版本没有打印任何东西?
  • 所以我已经做到了,而且它有效.. 老实说,我不确定为什么我的没有工作。我是她,顺便说一句。 :) 但我真的不知道发生了什么。考虑到我今天刚开始使用 Python,我也不能很好地调试它。
  • @chakolatemilk,我测试了你的原始代码,它对我有用。我相信有一些错误,你没有在你发布的代码中重现。
猜你喜欢
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2013-03-02
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多