仅列出子进程中的文件和目录名称 ls -l

List only files and directory names from subprocess ls -l

在使用 Popen 或 check_output 的 python 子进程中,我需要列出给定源目录中的文件和目录。但是我只能使用命令 ls -l.

示例代码

cmd = ["ls", "-l", source]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
stdout, stderr = proc.communicate()
exitcode = proc.returncode

if exitcode != 0:
    raise SystemError("Exitcode '{}', stderr: '{}', stdout: '{}'  for command: '{}'".format(
        exitcode, stderr, stdout, cmd))

从上面的proc,通过使用grep 或任何其他方式,我是否可以仅获得源目录中的文件和目录名称的列表而没有其他信息?

如果您坚持使用子流程,请尝试:

[x.split(' ')[-1] for x in stdout.decode().split('\n')[1:-1]]

显然,这是一种很好的 "hacky" 方法。相反,我可以建议标准库 glob

import glob
glob.glob(source + '/*')

returns 来源中所有 file/directory 个名字的列表。

编辑:

cmd = ["ls", source]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
stdout, stderr = proc.communicate()
exitcode = proc.returncode
stdout.decode("utf-8").split('\n')[:-1]

也应该这样做。 -l 这里不需要选项。

解析 ls 的输出是 bad idea for a few reasons。如果您的文件名有尾随 space,那么 ls 会将其显示为 'trailing space ',如果您尝试 open("'trailing space '"),它将不起作用。文件名也可以包含换行符。

改用pathlib

from pathlib import Path
source = Path("/path/to/some/directory")
[x.name for x in source.iterdir()]
# ['a_file', 'some_other_file.txt', 'a_directory']

正如 Charles Duffy 提到的,您可以使用 os。像这样。

import os
directory=#wherever you want to search
files_and_directories=os.listdir(directory)
Out: ['Directories and file names in a list']