【发布时间】:2015-05-17 03:50:28
【问题描述】:
我想在我的目录“excercise”下的所有文件中搜索关键字,该目录包含多个子目录,例如“20150516”。
这是我的代码:()
import os,sys,view_all
def search_special(file):
with open(file,'r') as fp:
while 1:
line = fp.readline()
if len(line) == 0:
break
if 'KeyboardInterrupt' in line:
res.append(file)
break
if not (file in res):
print "%s has no keyword 'KeyboardInterrupt'"%file
def traver_path(main_dir):
for path_name in os.listdir(main_dir):
current_dir = os.path.abspath(main_dir)
recursive_dir = os.path.join(current_dir,path_name)
if os.path.isdir(recursive_dir):
traver_path(recursive_dir)
if os.path.isfile(recursive_dir):
if path_name[-3:] == '.py':
search_special(recursive_dir)
if __name__ == "__main__":
res = []
traver_path('.')
# print res
for item in res:
view_all.print_file(item)
而且效果很好。但是,如果我对 func traver_path 进行一些更改,例如:
def traver_path(main_dir):
for path_name in os.listdir(main_dir):
if os.path.isdir(path_name):
traver_path(os.path.join(os.path.abspath(main_dir),path_name))
if os.path.isfile(path_name):
if path_name[-3:] == '.py':
search_special(os.path.join(os.path.abspath(main_dir),path_name))
请注意 os.path.isdir 和 os.path.isfile 的参数已更改。(不再是绝对路径)
当我通过 pdb 调试它时,我发现了一些有趣的东西。
(Pdb)
> /Users/Crayon_277/Develop/Project/Python/exercise/view_special.py(27)traver_path()
-> if os.path.isdir(path_name):
(Pdb) p path_name
'20150507'
(Pdb) n
> /Users/Crayon_277/Develop/Project/Python/exercise/view_special.py(28)traver_path()
-> traver_path(os.path.join(os.path.abspath(main_dir),path_name))
进入子目录20150507
(Pdb) p path_name
'common_divisor.py'
(Pdb) n
> /Users/Crayon_277/Develop/Project/Python/exercise/view_special.py(29)traver_path()
-> if os.path.isfile(path_name):
(Pdb) s
--Call--
> /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/genericpath.py(26)isfile()
-> def isfile(path):
(Pdb) return
--Return--
> /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/genericpath.py(31)isfile()->False
-> return False
返回False,应该是True,导致common_divisor.py 是一个文件。
另一个测试:
>>> for i in os.listdir('.'):
... print i,str(os.path.isfile(i))
...
.DS_Store True
.view_all.py.swp True
.view_special.py.swp True
20150506 False
20150507 False
20150509 False
20150510 False
20150511 False
20150512 False
20150513 False
20150514 False
20150516 False
view_all.py True
view_all.pyc True
view_special.py True
>>> for i in os.listdir('./20150509'):
... print i,str(os.path.isfile(i))
...
bibao.py False
chinese_test.py False
decorate.py False
encrypt.py False
isinstance_test.py False
python3_test.py False
我是否得出了正确的结论,即 os.path.isfile 使用绝对路径比使用相对路径更好?
为什么?
【问题讨论】:
-
您知道吗?只需使用
grep就可以避免所有这些? -
@MattDMo 不。但是 grep 是一个 shell 命令吗?你能说得更具体一点吗?
-
你也可以使用
os.walk() -
您是否点击了我提供的链接?
grep是大多数 Unix 和 Linux 平台上可用的实用程序,包括 OS X(我假设您根据路径名使用它)。该链接提供了有关如何使用它的所有详细信息,或者您可以在终端中输入man grep。 -
@MattDMo 谢谢。明白了
标签: python