Discuss / Python / 搞了蛮久。

搞了蛮久。

Topic source

Nuomi1

#1 Created at ... [Delete] [Delete and Lock User]

第二题第一版

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os

key = input('Please inter what you want to search:\n')

def find_files(path, key):
    abspath = os.path.abspath(path)
    for x in os.listdir(path):
        absfile = os.path.join(path, x)
        if os.path.isfile(absfile):
            if key in os.path.split(x)[1]:
                print(os.path.abspath(absfile))
        if os.path.isdir(absfile):
            find_files(absfile, key)

find_files('.', key)

第二题第二版

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os

key = input('Please inter what you want to search:\n')

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))

还是内置函数厉害……

Nuomi1

#2 Created at ... [Delete] [Delete and Lock User]

inter -> enter

乃木坂骑

#3 Created at ... [Delete] [Delete and Lock User]

谢谢你的代码,写得不错,第二版里有几个小问题:

os.walk返回的tuple的第三项,也就是代码里的y,是一个文件名的列表,所以没必要再split,可以直接和key进行比较;然后题目要求是打印相对路径,把abspath改成relpath就好了。

G-Master-G

#4 Created at ... [Delete] [Delete and Lock User]

。。。能告诉我[0],[1]和[2]指的是什么吗?

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))

这样也能运行,好像也没啥问题

请问答主是如何发现os.walk这个方法的? 也就是说在不了解os这个模块的情况下如何详细了解os中函数的用法的?

《第二题第一版》此题中有两个错误!!!

有错误但还是需要承认在此题中学习了思路

错误一:

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

Reply