【问题标题】:Making a Block of Text into a list将文本块制作成列表
【发布时间】:2015-12-30 04:50:27
【问题描述】:

我正在编写一个 Python 脚本来枚举计算机上运行的所有进程。我当前的代码执行此操作,但将其打印在一大块难以阅读的文本中。如何改进我的脚本,使每个进程和所有进程的输出文本都出现在垂直列表中?

import subprocess
print(subprocess.check_output('set',shell=True)

*Edit: 这是上面脚本的输出文本

【问题讨论】:

  • 举个例子,你的输出应该是什么样子。我发现输出已经很可读了。
  • subprocess.check_output 返回一个字符串。你可以用它做任何你想做的事情,例如用split用换行符分割它,这将创建一个列表。
  • @user38034 将被空格分割。也许你的意思是分割线。
  • @wim 我的意思是s.split('\n') ;-)
  • 也就是说,splitlines 严格来说更好(当文件碰巧以换行符结尾时,它不会以空的str 结束结果列表,许多文本编辑器会自动插入),并提供在保留换行符的同时拆分的选项。

标签: python subprocess python-3.5


【解决方案1】:

set 应该已经用换行符打印了,所以如果它们没有出现,那就是比你告诉我们的更错误。如果你想分开设置,你总是可以加倍换行,例如:

import subprocess
print(subprocess.check_output('set',shell=True).replace('\n', '\n\n'))

如果问题是您在 Python 3 上运行,并且 bytes 对象是一个大 blob,您可以将 subprocess 解码为友好的可打印字符串:

print(subprocess.check_output('set',shell=True, universal_newlines=True))
# Yes, the name of the keyword is dumb; it sounds like it handles different
# line ending conventions, but on Python 3, it also decodes from `bytes`
# to `str` for you.

对于换行的一般情况(尽管它对“太大”的文本段落没有任何作用),您可能想查看textwrap module;它将一个文本块拆分为list 行,在单词边界处很好地包裹,这样您就不会跨行拆分单词。

【讨论】:

  • .replace('\n', '\n\n') 不正确;输出显示 OP 使用 Python 3。universal_newlines=True 使用 locale.getpreferredencoding(False) 可能返回类似 cp1252 的内容,而 set 可能使用 cmd.exe OEM 编码,例如 cp437。如果您出于某种原因不想使用os.environ(可能在Windows 上使用Unicode API),那么您可以尝试force set to use utf-16 encoding, to support non-ascii paths
【解决方案2】:

免责声明:我以前没有做过你正在做的事情,但这可能会奏效。

import subprocess

processes = subprocess.check_output('set',shell=True)

processes = processes.decode('UTF-8').split('\n') # convert bytes to unicodes and split 

for process in processes:
    print(process)

【讨论】:

  • @DylanF:set 不太可能在这里使用 utf-8;它可能是cp437,即,如果有非 ascii 路径,预计会失败。您问题中的输出清楚地表明换行符是b'\r\n',而不是'\n'
【解决方案3】:

set is an internal command 在您的情况下显示 cmd.exe 环境变量。

要在 Python 中获取环境变量,请改用 os.environ

如果您想将set 命令的输出作为字符串列表(未测试):

#!/usr/bin/env python3
import os
from subprocess import check_output

lines = check_output('cmd.exe /U /c set').decode('utf-16').split(os.linesep)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2015-01-05
    • 2019-03-28
    相关资源
    最近更新 更多