为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

潇潇雨雨 2022-01-05 12:16:25
在使用 Popen 或 check_output 的 python 子进程中,我需要列出给定源目录中的文件和目录。但我只能使用命令ls -l。示例代码cmd = ["ls", "-l", source]proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)stdout, stderr = proc.communicate()exitcode = proc.returncodeif exitcode != 0:    raise SystemError("Exitcode '{}', stderr: '{}', stdout: '{}'  for command: '{}'".format(        exitcode, stderr, stdout, cmd))从上面proc,通过使用 grep 或任何其他方式,我可以只获取源目录中的文件和目录名称列表而没有其他信息吗?
查看完整描述

3 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

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


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

显然,这是一种非常“hacky”的方式。相反,我可以建议标准库glob


import glob

glob.glob(source + '/*')

返回源中所有文件/目录名称的列表。


编辑:


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这里不需要选项。


查看完整回答
反对 回复 2022-01-05
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

由于几个原因,解析 的输出ls是一个坏主意。如果您的文件名有尾随空格,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']


查看完整回答
反对 回复 2022-01-05
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

正如查尔斯·达菲 (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']


查看完整回答
反对 回复 2022-01-05
  • 3 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信