Выводить только имена файлов и каталогов из подпроцесса ls -l - PullRequest
1 голос
/ 09 апреля 2019

В подпроцессе Python, использующем Popen или check_output, мне нужно перечислить файлы и каталоги в заданном исходном каталоге.Но я могу использовать только команду 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 или любую другуюКстати, я могу получить только список файлов и имен каталогов внутри исходного каталога без другой информации?

Ответы [ 3 ]

2 голосов
/ 10 апреля 2019

Анализ выходных данных 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']
2 голосов
/ 09 апреля 2019

Если вы настаиваете на использовании подпроцесса, попробуйте:

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

Очевидно, это довольно "хакерский" способ сделать это.Вместо этого я могу предложить стандартную библиотеку 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 голос
/ 10 апреля 2019

Как упоминал Чарльз Даффи, вы можете использовать ОС.Вот так.

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