Переформатировать вывод из subprocess.run()

У меня питон 3.5. После захвата вывода из терминала в моей Python IDE он выглядит немного иначе. В нем есть дополнительные символы, которые мне не нужны, например '\n' или "b''". Я пытался использовать split() и replace(), но ничего не работает. Что я делаю неправильно?

def runIndexTest(zone):

    print('Turning OFF flit on ' + zone)
    #setIndexStatus(zone, 'stop')

    cmd1 = 'psql -h ' + zone + ' -U filmlight -t -c ' + '"' + """SELECT datname FROM pg_database WHERE datistemplate = false AND datname LIKE """ + "'fsdb%'" + ';"'
    #print(cmd1)

    out = subprocess.run(cmd1, shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)
    print(out.stdout)

    db_list = str(out.stdout).split(' ')
    for db in db_list:
        db = db.replace("\n", '')
        if db == "b'":
            db_list.remove(db)
            continue

    print('Length of db_list:', len(db_list))
    print(db_list)

Выход:

b' fsdb\n fsdb1\n fsdb_fetish_images$v1\n fsdb_fetish_images\n fsdb_fetish_images$v2\n\n'
Length of db_list: 5
['fsdb\\n', 'fsdb1\\n', 'fsdb_fetish_images$v1\\n', 'fsdb_fetish_images\\n', "fsdb_fetish_images$v2\\n\\n'"]

Желаемый результат:

['fsdb', 'fsdb1', 'fsdb_fetish_images$v1', 'fsdb_fetish_images', 'fsdb_fetish_images$v2']

Я думаю, вы можете использовать функцию str(your_string_here) для ее преобразования. Но если вы используете decode("utf-8"), он все равно не должен появляться

michal-ko 17.07.2019 10:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать понимание списка:

db_list = str(out.stdout).split(' ')
db_list = [x.replace("\\n", '') for x in db_list if x!= "b'" ]
Ответ принят как подходящий

Вам нужно расшифровать строку:

print(out.stdout.decode("utf-8"))

b'...' — это байтовый литерал. Чтобы получилось strрасшифровать это. '\n' - это символы новой строки, которые представляют собой пробелы, использующие str.split() с аргументом по умолчанию (пробел).

In [9]: s
Out[9]: b' fsdb\n fsdb1\n fsdb_fetish_images$v1\n fsdb_fetish_images\n fsdb_fetish_images$v2\n\n'

In [10]: s.decode('utf-8')
Out[10]: ' fsdb\n fsdb1\n fsdb_fetish_images$v1\n fsdb_fetish_images\n fsdb_fetish_images$v2\n\n'

In [11]: s.decode('utf-8').split()
Out[11]: 
['fsdb',
 'fsdb1',
 'fsdb_fetish_images$v1',
 'fsdb_fetish_images',
 'fsdb_fetish_images$v2']

Другие вопросы по теме