![](/img/trans.png)
[英]Linux:How to list the information about file or directory(size,permission,number of files by type?) in total
[英]In Python, list certain type of file in a directory on Linux
在我的目录中,.log文件中有一种类型的文件结尾。 通常,我使用ls。* log命令列出所有文件。
但是,我想使用Python代码来处理它。 我试过两种方法。
第一:
import subprocess
ls_al = subprocess.check_output(['ls','.*log'])
但它返回ls: .*log: No such file or directory
第二:
import subprocess
ls_al = subprocess.check_Popen(['ls','.*log'],stdout=subprocess.PIPE)
ls = ls_al.stdout.read().strip()
但那两个没用。
有人能帮忙吗?
外壳模式由shell扩展,但您直接运行命令。 你必须通过shell运行命令:
ls_al = subprocess.check_output('ls *.log', shell=True)
您将完整命令行作为字符串传递给shell的位置(并使用正确的glob语法)。
演示(使用*.py
):
>>> subprocess.check_output(['ls', '*.py'])
ls: *.py: No such file or directory
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/subprocess.py", line 575, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['ls', '*.py']' returned non-zero exit status 1
>>> subprocess.check_output('ls *.py', shell=True)
'calc.py\ndAll.py\nexample.py\ninplace.py\nmyTests.py\ntest.py\n'
请注意, Python中的正确方法是使用os.listdir()
手动过滤,使用fnmatch
模块过滤,或使用glob
模块列出和过滤:
>>> import glob
>>> glob.glob('*.py')
['calc.py', 'dAll.py', 'example.py', 'inplace.py', 'myTests.py', 'test.py']
.*log
似乎是正则表达式,而不是globbing模式。 你的意思是*.log
? (需要shell=True
参数才能使shell进行全局扩展)
BTW,如果你想要文件路径列表, glob.glob('*.log')
是更好的方法。
您可以使用Python的os模块来获取目录中的文件,而不是运行外部命令。 然后, re模块可用于创建正则表达式以过滤日志文件。 我认为这将是一种更加pythonic的方法。 它也应该在多个平台上工作而无需修改。 请注意,在下面的代码中,我假设您的日志文件都以'.log'结尾; 如果你需要别的东西,你需要修补正则表达式。
import os
import re
import sys
the_dir = sys.argv[1]
all_files = os.listdir(the_dir)
log_files = []
log_pattern = re.compile('.*\.log')
for fn in all_files:
if re.match(log_pattern, fn):
log_files.append(fn)
print log_files
为什么不使用glob
?
$ ls
abc.txt bar.log def.txt foo.log ghi.txt zoo.log
$ python
>>> import glob
>>> for logfile in glob.glob('*.log'):
... print(logfile)
...
bar.log
foo.log
zoo.log
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.