在使用Popen或check_output的python子进程中,我需要列出给定源目录中的文件和目录。但是我只能使用命令 ls -l </ strong>。
示例代码
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或任何其他方式,我能否仅获取源目录中的文件和目录名称列表而没有其他信息?
答案 0 :(得分:2)
如果您坚持使用子流程,请尝试:
[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
选项。
答案 1 :(得分:2)
解析ls
的输出是bad idea for a few reasons。如果您的文件名末尾有空格,那么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']
答案 2 :(得分:1)
正如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']