Python 如何将*.txt匹配文件的搜索结果保存到变量?

Python 如何将*.txt匹配文件的搜索结果保存到变量?,python,python-3.x,Python,Python 3.x,我对python相当陌生。我想将at在此脚本中打印的文本保存为变量。(如果有必要的话,变量将在以后写入文件。)我如何才能做到这一点 import fnmatch import os for file in os.listdir("/Users/x/y"): if fnmatch.fnmatch(file, '*.txt'): print(file) 您可以将其存储在列表中: import fnmatch import os matches = [] for file

我对python相当陌生。我想将at在此脚本中打印的文本保存为变量。(如果有必要的话,变量将在以后写入文件。)我如何才能做到这一点

import fnmatch
import os

for file in os.listdir("/Users/x/y"):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)

您可以将其存储在列表中:

import fnmatch
import os

matches = []
for file in os.listdir("/Users/x/y"):
    if fnmatch.fnmatch(file, '*.txt'):
        matches.append(file)

您可以将其存储在变量中,如下所示:

import fnmatch
import os

for file in os.listdir("/Users/x/y"):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)
        my_var = file
        # do your stuff
或者,您可以将其存储在列表中以供以后使用:

import fnmatch
import os
my_match = []

for file in os.listdir("/Users/x/y"):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)
        my_match.append(file)       # append insert the value at end of list
# do stuff with my_match list

已经提供的两个答案都是正确的,但是Python提供了一个很好的替代方案。由于遍历数组并附加到列表是一种常见的模式,因此列表理解被创建为该过程的一站式服务

import fnmatch
import os

matches = [filename for filename in os.listdir("/Users/x/y") if fnmatch.fnmatch(filename, "*.txt")]

也许定义效用函数是正确的选择

def list_ext_in_dir(e,d):
    """e=extension, d= directory => list of matching filenames.
    If the directory d cannot be listed returns None."""

    from fnmatch import fnmatch
    from os import listdir

    try:
        dirlist = os.listdir(d)
    except OSError:
        return None

    return [fname for fname in dirlist if fnmatch(fname,e)]
  • 我已将
    dirlist
    放在
    try
    except
    子句中以捕获 可能无法列出目录(不存在,已读) 许可等)。错误的处理有点简单,但是

  • 匹配文件名列表是使用一个所谓的函数来构建的,如果要在程序中使用
    python
    ,您应该尽快研究这个函数

要关闭我的帖子,请看一个用法示例

l_txtfiles = list_ext_in_dir('*.txt','/Users/x/y;)

虽然NSU的答案和其他答案都非常好,但可能有一种更简单的方法来获得你想要的

正如
fnmatch
测试某个文件是否与shell样式通配符匹配一样,列出了与shell样式通配符匹配的所有文件。事实上:

这是通过同时使用
os.listdir()
fnmatch.fnmatch()
函数来完成的

因此,您可以这样做:

import glob
matches = glob.glob("/Users/x/y/*.txt")
但是请注意,在本例中,您将获得像
'/Users/x/y/spam.txt'
这样的完整路径名,而不仅仅是
'spam.txt'
,这可能不是您想要的。通常,在需要显示时保留完整路径名和
os.path.basename
比在需要打开时仅保留基本名称和
os.path.join
更容易…但“经常”并不是“总是”

还要注意,我必须手动将
“/Users/x/y/”
“*.txt”
粘贴到一个字符串中,就像在命令行中那样。这在这里很好,但是,如果第一个来自变量,而不是硬编码到源代码中,那么您必须使用
os.path.join(basepath,*.txt”)
,这并没有那么好

顺便说一句,如果您使用的是Python 3.4或更高版本,您可以从更高级别的库中获得相同的内容:


哪个函数的输出
fnmatch.fnmatch
我指的是打印的文本,也许现在解释得更好谢谢!这就是我将要使用的。这正是我所需要的脚本,我正在处理,只是它不会递归地通过文件。这是否安全/可靠使用?:“matches=glob.glob(“/Users/x/y/*/*/*.txt)”这似乎是一种递归获取所有.txt文件的方法(通过不止一个级别的文件夹),或者,换句话说,与coreutils.Hm中的“find”命令(加上grep)一样,我想如果一个txt文件在y/(可能发生这种情况)中,这将不起作用。我将就此写一个单独的问题。@Var87:为了未来读者的利益而链接。但快速的回答是:它实际上可以工作……但没有文档记录它可以工作,所以你应该使用
os.walk
,就像你的新问题一样。你刚刚编写了一个更有限版本的
glob.glob
。(有时,在函数定义的中间导入模块不是一种正常的方式。有时候,有一些很好的理由来做SO,例如,如果您需要懒洋洋地链接模块,因为它很慢导入,不总是使用,或者因为存在循环依赖性,但是如果您没有一个好的理由,那么您有点暗示读者T。(你是干什么的。)
import pathlib
matches = list(pathlib.Path("/Users/x/y/").glob("*.txt"))