我对python相当陌生。我想将以此脚本打印的文本保存为变量。 (如果这个问题很重要的话,这个变量将被写入一个文件中。)我该怎么做?如何将搜索匹配* .txt的文件的输出保存到变量中?
import fnmatch
import os
for file in os.listdir("/Users/x/y"):
if fnmatch.fnmatch(file, '*.txt'):
print(file)
我对python相当陌生。我想将以此脚本打印的文本保存为变量。 (如果这个问题很重要的话,这个变量将被写入一个文件中。)我该怎么做?如何将搜索匹配* .txt的文件的输出保存到变量中?
import fnmatch
import os
for file in os.listdir("/Users/x/y"):
if fnmatch.fnmatch(file, '*.txt'):
print(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
您可以将其存储在一个列表:
import fnmatch
import os
matches = []
for file in os.listdir("/Users/x/y"):
if fnmatch.fnmatch(file, '*.txt'):
matches.append(file)
这两个答案已经提供了一个更正确,但Python提供了一个很好的选择。由于遍历数组并追加到列表中是一种常见模式,因此列表理解被创建为该过程的一站式商店。
import fnmatch
import os
matches = [filename for filename in os.listdir("/Users/x/y") if fnmatch.fnmatch(filename, "*.txt")]
谢谢!这是我将要使用的一个。 – Var87 2014-12-13 09:13:14
可能定义一个效用函数是跟随我已经把dirlist
一个try
except
子句中赶 可能性在正确的道路......
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;)
你刚刚写了一个更有限的'glob.glob'版本。 (另外,在函数定义的中间导入模块并不是正常的风格,有时候有充足的理由这样做 - 例如,如果您需要懒惰地链接模块,因为导入非常慢并且不经常使用,或者因为有循环依赖 - 但如果你没有一个很好的理由,那么对读者来说你就是这么做的。) – abarnert 2014-12-17 23:38:07
虽然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"))
这正是我所需要的一个脚本,我正在研究它,除了它没有递归地去掉低谷文件。这是安全/健壮的使用吗?:“matches = glob.glob(”/ Users/x/y/*/*。txt)“它似乎工作作为一种方式获得所有.txt文件递归(槽不仅仅是或者换句话说,与coreutils中的“find”命令(加上grep)一样。 – Var87 2014-12-13 13:13:06
嗯,我想这不会工作,如果一个txt文件在y /(可能发生) 。我会写一个关于这个问题的单独的问题。 – Var87 2014-12-13 13:48:44
@ 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
输出? 'fnmatch.fnmatch' – 2014-12-13 08:20:04
我的意思是打印的文字,也许现在更好解释 – Var87 2014-12-13 08:21:40