您好,我有一个这样的字符串:
AdvancedHTMLParser (8.0.1)\nappdirs (1.4.3)\nbeautifulsoup4 (4.6.0)\nchardet (3.0.4)\nchrome-gnome-shell (0.0.0)\ncupshelpers (1.0)\ncycler (0.10.0)\nCython (0.27.3)
我想将其拆分为元组列表。 这样每个列表项都有一个带有两个值的元组,名称和版本(没有括号)。
我只能用换行符分割字符串,但我不知道如何正确地抓住括号中的数字等 有人能解释我怎么能这样做吗?
编辑:
我正在尝试解析pip list local
def get_installed_modules(self):
data = subprocess.check_output(["pip", "list", "--local"])
result = [tuple(line.replace('(', '').replace(')', '').split())
for line in data.splitlines()]
print(result)
我有一个项目,我不能拆分字符串,但它需要像对象一样的字节...
TypeError: a bytes-like object is required, not 'str'
答案 0 :(得分:3)
选项1
如果您从pip
获取这些输出,则可以使用pip.operations.freeze
-
from pip.operations import freeze
modules = list(
map(lambda x: x.split('=='), freeze.freeze(local_only=True))
)
print(modules)
[['aiodns', '1.1.1'],
['aiohttp', '1.2.0'],
['appdirs', '1.4.0'],
['appnope', '0.1.0'],
['argparse', '1.4.0'],
...
选项2
您也可以使用get_installed_distributions
取自here:
import pip
modules = []
for i in pip.utils.get_installed_distributions():
modules.append((i.key, i.version))
print(modules)
[('pytreebank', '0.2.4'),
('cssselect', '1.0.1'),
('numba', '0.36.0.dev0+92.g2818dc9e2'),
('llvmlite', '0.0.0'),
('yarl', '0.8.1'),
('xlwt', '1.3.0'),
('xlrd', '1.1.0'),
...
]
选项3
第三种方法是使用pip.main
-
import pip
pip.main(['list', 'local'])
但是,这会写入stdout
。
答案 1 :(得分:2)
您还可以使用regular expressions:
>>> s = "AdvancedHTMLParser (8.0.1)\nappdirs (1.4.3)\nbeautifulsoup4 (4.6.0)\nchardet (3.0.4)\nchrome-gnome-shell (0.0.0)\ncupshelpers (1.0)\ncycler (0.10.0)\nCython (0.27.3)"
>>> re.findall(r"(.+) \((.+)\)", s)
[('AdvancedHTMLParser', '8.0.1'),
('appdirs', '1.4.3'),
('beautifulsoup4', '4.6.0'),
('chardet', '3.0.4'),
('chrome-gnome-shell', '0.0.0'),
('cupshelpers', '1.0'),
('cycler', '0.10.0'),
('Cython', '0.27.3')]
答案 2 :(得分:1)
直接地:
data = 'AdvancedHTMLParser (8.0.1)\nappdirs (1.4.3)\nbeautifulsoup4 (4.6.0)\nchardet (3.0.4)\nchrome-gnome-shell (0.0.0)\ncupshelpers (1.0)\ncycler (0.10.0)\nCython (0.27.3)'
result = [tuple(line.replace('(', '').replace(')', '').split())
for line in data.splitlines()]
print(result)
输出:
[('AdvancedHTMLParser', '8.0.1'), ('appdirs', '1.4.3'), ('beautifulsoup4', '4.6.0'), ('chardet', '3.0.4'), ('chrome-gnome-shell', '0.0.0'), ('cupshelpers', '1.0'), ('cycler', '0.10.0'), ('Cython', '0.27.3')]
答案 3 :(得分:1)
分开开头的每一行paren&删除最后一个:
self.__all_modules = [tuple(x[:-1].split(" (")) for x in data.splitlines()]
答案 4 :(得分:1)
最新版本的pip(> 10.0)不再接受已接受的答案
所有这些方法现在都在私有软件包中。 例如,冻结模块位于_internal/operations中。您仍然可以使用它,但是就我个人而言,使用内部软件包不是一个好主意。它们可能会在新版本中轻松移动或更改。
您可以做的就是继续使用pip cli版本,使用--format json
选项格式化输出,然后在python中进行解析。
import subprocess
import json
data = subprocess.check_output(["pip", "list", "--format", "json"])
parsed_results = json.loads(data)
[(element["name"], element["version"]) for element in parsed_results]