2014-12-13 53 views
2

我对python相当陌生。我想将以此脚本打印的文本保存为变量。 (如果这个问题很重要的话,这个变量将被写入一个文件中。)我该怎么做?如何将搜索匹配* .txt的文件的输出保存到变量中?

import fnmatch 
import os 

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

输出? 'fnmatch.fnmatch' – 2014-12-13 08:20:04

+0

我的意思是打印的文字,也许现在更好解释 – Var87 2014-12-13 08:21:40

回答

3

,你可以将其存储在变量是这样的:

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 
3

您可以将其存储在一个列表:

import fnmatch 
import os 

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

这两个答案已经提供了一个更正确,但Python提供了一个很好的选择。由于遍历数组并追加到列表中是一种常见模式,因此列表理解被创建为该过程的一站式商店。

import fnmatch 
import os 

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

谢谢!这是我将要使用的一个。 – Var87 2014-12-13 09:13:14

1

可能定义一个效用函数是跟随我已经把dirlist一个tryexcept子句中赶 可能性在正确的道路......

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)] 
  • ,我们不能单该目录(不存在,读取 权限等)。错误的治疗是一个有点简单化,但是......

  • 匹配的文件名列表使用所谓的list comprehension建,那是后话,你应该尽快进行调查,如果你打算使用python为您的节目。

要关闭我的帖子,一个使用示例

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

你刚刚写了一个更有限的'glob.glob'版本。 (另外,在函数定义的中间导入模块并不是正常的风格,有时候有充足的理由这样做 - 例如,如果您需要懒惰地链接模块,因为导入非常慢并且不经常使用,或者因为有循环依赖 - 但如果你没有一个很好的理由,那么对读者来说你就是这么做的。) – abarnert 2014-12-17 23:38:07

1

虽然NSU的回答,其他都是非常不错的,有可能一个简单的方法来得到你想要的。

就像fnmatch测试某个文件是否与shell风格的通配符匹配,glob列出了与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或更高版本,可以得到同样的事情了更高级别的pathlib库:该功能

import pathlib 
matches = list(pathlib.Path("/Users/x/y/").glob("*.txt")) 
+0

这正是我所需要的一个脚本,我正在研究它,除了它没有递归地去掉低谷文件。这是安全/健壮的使用吗?:“matches = glob.glob(”/ Users/x/y/*/*。txt)“它似乎工作作为一种方式获得所有.txt文件递归(槽不仅仅是或者换句话说,与coreutils中的“find”命令(加上grep)一样。 – Var87 2014-12-13 13:13:06

+0

嗯,我想这不会工作,如果一个txt文件在y /(可能发生) 。我会写一个关于这个问题的单独的问题。 – Var87 2014-12-13 13:48:44

+1

@ Var87:为未来读者的利益链接[这个单独的问题](http://stackoverflow.com/q/27459579/908494)。但快速回答是:它实际上_can_可以工作......但它不会被_documented_工作,所以你应该在你的新问题中使用'os.walk'作为[falsetru的答案](http://stackoverflow.com/a/27459625/908494)。 – abarnert 2014-12-17 23:36:18

相关问题