搞了蛮久。
Topic source谢谢你的代码,写得不错,第二版里有几个小问题:
os.walk
返回的tuple的第三项,也就是代码里的y
,是一个文件名的列表,所以没必要再split
,可以直接和key
进行比较;然后题目要求是打印相对路径,把abspath
改成relpath
就好了。
for x in os.walk('.'):
for y in x[2]:
if key in os.path.split(y)[1]:
print(os.path.join(os.path.abspath(x[0]), y))
x的值是个tuple,如下
('./git/learn-python3/teach', [], ['learning.py', 'README.md', 'run-learning.py.png'])
x[2]的值对应第三项['learning.py', 'README.md', 'run-learning.py.png']
也就是y,是个list
os.path.split(y)[1]
的返回值也是一个tuple,第一项为目录,第二项为文件名。
这觉得奇怪,楼主为嘛要这句os.path.split(y)[1]
,y内的元素本身就是不带路径的文件名。
因此我将代码改成这样了
for x in os.walk('.'):
for y in x[2]:
if key in y:
print(os.path.join(os.path.abspath(x[0]), y))
这样也能运行,好像也没啥问题
《第二题第一版》此题中有两个错误!!!
有错误但还是需要承认在此题中学习了思路
错误一:
abspath = os.path.abspath(path)
此句将os.path.abspath(path)赋值给abspath,但是下面这句又没有使用此变量,而是使用了path
for x in os.listdir(path):
错误二:
在判断搜索的文件是不是目录时,缺少传入文件(key)与os.path.split(x)[1]的判断,使用查找的文件是目录时失败,错误点如下:
if os.path.isdir(absfile):
find_files(absfile, key)
失败的结果会是:1、当搜索的文件是目录时,没有输出结果 2、当该目录下存在同名的目录和文件时,只能输出对应的文件 修改点:
if os.path.isdir(absfile):
if key in os.path.split(x)[1]:
print(absfile)
++++++++++++++++++编写建议++++++++++++++++++++++ 变量最好不要出现关键字,如此题中的key、abspath等,正确答案如下:
import os
keyy = input('Please inter what you want to search:\n')
def find_files(path, keyy):
abspath1 = os.path.abspath(path)
#print(abspath1)
for x in os.listdir(abspath1):
absfile = os.path.join(abspath1, x)
#print(absfile)
if os.path.isfile(absfile):
if keyy in os.path.split(x)[1]:
print(os.path.abspath(absfile))
if os.path.isdir(absfile):
if keyy in os.path.split(x)[1]:
#print(find_files(absfile,keyy))
print(absfile)
#find_files(absfile,keyy)
#print(os.path.abspath(absfile))
#print(absfile)
find_files('.', keyy)
- 1
Nuomi1
第二题第一版
第二题第二版
还是内置函数厉害……