繁体   English   中英

在Python中,列出Linux上某个目录中的某些类型的文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM