【问题标题】:In Python, list certain type of file in a directory on Linux在 Python 中,列出 Linux 目录中特定类型的文件
【发布时间】:2014-01-18 10:15:42
【问题描述】:

在我的目录中,有一种以 .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() 

但是这两个都没用。

有人可以帮忙吗?

【问题讨论】:

  • 我不知道 globbing 是否以这种方式工作,但如果是的话,您是不是想说['ls','*.log']

标签: linux python-2.7


【解决方案1】:

.*log 看起来像正则表达式,而不是通配符模式。你的意思是*.log? (需要shell=True 参数来使shell 进行全局扩展)

顺便说一句,如果您想要文件路径列表,glob.glob('*.log') 是更可取的方式。

【讨论】:

  • 使用*.log 也不起作用,因为执行全局扩展的是shell,而不是ls 命令。
  • @MartijnPieters,啊..我忘记了shell 参数。感谢您的评论。
【解决方案2】:

通配模式由 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 module一起列出和过滤:

>>> import glob
>>> glob.glob('*.py')
['calc.py', 'dAll.py', 'example.py', 'inplace.py', 'myTests.py', 'test.py']

【讨论】:

    【解决方案3】:

    为什么不使用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
    >>>
    

    【讨论】:

      【解决方案4】:

      您可以使用 Python 的 os module 来获取目录中的文件,而不是运行外部命令。然后re module 可以用来创建一个正则表达式来过滤你的日志文件。我认为这将是一种更 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
      

      【讨论】:

        猜你喜欢
        • 2011-04-01
        • 1970-01-01
        • 2020-10-22
        • 2015-01-07
        • 1970-01-01
        • 2013-04-13
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        相关资源
        最近更新 更多