【问题标题】:how do i search for specific files by user input如何通过用户输入搜索特定文件
【发布时间】:2015-02-24 00:02:46
【问题描述】:

使用 python 2.7 是的,这是我对我见过的最吓人的论坛提出的第一个问题。 首先,我不是程序员,但我正在努力学习。

我希望能够搜索一个非常大的 mp3 目录并告诉我我输入的内容是否在那里并将其显示在屏幕上。而已! 细节: 我对编程很陌生,需要很多细节。我愿意自学,需要知道在哪里寻找答案。我一直在这里,谷歌和其他地方四处寻找,但没有关于我的项目的确切信息。

这是我的代码:抱歉,我是新手,需要了解。

from sys import argv
from os import walk
import os

prompt = ':)'


print ("Can I help you with anything today?")
filename = raw_input(prompt)


print ("Looking for %r .... This might take a sec.") % filename
#This is where i get stumped, should I use this or something else?
#don't know how to put userinput into search
for dirname, dirnames, filenames in os.walk('.'):
    # print path to all subdirectories first.
    for subdirname in dirnames:
        print os.path.join(dirname, subdirname)

    # print path to all filenames.
    for filename in filenames:
        print os.path.join(dirname, filename)

print (" That's all i got")
print ("Hit ENTER to exit")
raw_input(prompt)

运行它会显示所有文件的列表。我需要,对于 EG:raw_input(prompt) = Tina Turner。我希望程序查找所有名为“Tina Turner”的文件并显示它们。 babysteps 请,我应该使用 walk 还是 find_all 或者......我已经疯了,试图自己解决这个问题。寻找关于我不理解或不知道我在寻找什么的文档是非常令人困惑的。我是一个菜鸟,因此非常感谢您指出正确的方向。 希望我没有用这个生活故事的解释来“P”任何1。 如果我在几天内没有阅读任何内容,我会知道为什么。

【问题讨论】:

    标签: python directory find glob


    【解决方案1】:

    如果您只有一个文件目录,那么您可以使用glob 模块。为此,您必须import glob

    那是

     for i in glob.glob(filename):
           print i
    

    glob 模块在搜索类似模式时非常有用。

    注意-glob.glob 中的参数必须是目录的完整路径。即如果文件在桌面中,您将必须传递home/user/Desktop/*Tina Turner*,其中* 是一个元字符,以匹配名称为Tina Turner 的任何其他文件

    或者搜索所有可以做的子目录

    for dirname, dirnames, filenames in os.walk('.'):
         for i in glob.glob(dirname+'/*'+filename+'*'):
               print i
    

    【讨论】:

    • 脚本将被放置在根目录下。我将需要搜索子目录作为某个点。我能看到一个例子吗?
    • @DaveReid 你找到问题的答案了吗?
    • 我尝试了这两种方法,但都没有成功。我仍在四处寻找(书籍、互联网、朋友……是的,我有 1 个)以获取更多信息。我无法让它搜索我在提示时输入的内容。我可以调出所有文件,但不仅仅是我想要的。
    • @DaveReid 看看这个编辑。即使你注定不会得到它,你也会得到输出:)(因为我使用过 metachars)
    • 我对 Bhargav Rao 感激不尽。感谢您的时间和精力。我会回来获取更多(信息)现在让它循环,这样我们就可以请求更多文件。好玩!
    【解决方案2】:

    我将尝试尽可能少地偏离您的原始代码,尽管对于您的用例,可能使用 @BhargavRao 的 answer 中解释的 glob 更适合您的需求。

    据我了解,我认为有几点需要考虑:

    1. 您正在用for filename in filenames: 覆盖filename = raw_input 中的filename 变量
    2. 通过将walk 的目录设置为('.'),您将遍历脚本所在的当前目录。如​​果您想遍历整个“硬盘驱动器”,您只需执行walk('/')

    现在,这就是说,您可以使用in 运算符来检查用户输入的字符串是否在文件名中:

    import os
    
    prompt = ':)'
    
    
    print ("Can I help you with anything today?")
    filename = raw_input(prompt)
    
    
    print ("Looking for %r .... This might take a sec.") % filename
    #This is where i get stumped, should I use this or something else?
    #don't know how to put userinput into search
    for dname, _, fnames in os.walk('.'):
        # print path to all filenames.
        for fname in fnames:
            if filename in fname:
                print "FOUND: %s" % os.path.abspath(os.path.join(dname, fname))
    
    print (" That's all i got")
    print ("Hit ENTER to exit")
    raw_input(prompt)
    

    【讨论】:

    • 在哪里可以找到关于为什么它在文件名的输出上给我 1 个字母的文档?例如:user_input = readme 结果行 1 /home/blah/blah/r 结果行 2 /home/blah/blah/e
    • 这听起来像是您正在遍历 "readme"string... 在您的终端中尝试:for letter in "readme": print letter 可能您将用户的输入存储到了 filename 变量中,而您正在做类似for foo in filename 的事情。那时,filename 是一个字符串,for 一个字母一个字母地给你(这是我的猜测,没有更多信息)
    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多