2012-10-19 38 views
0

在python中通过\n\n拆分字符串的最简单方法是什么?如何解析一个zcat输出

这是我的原始字符串,其来源于http://ftp2.de.debian.org/debian/dists/stable/main/binary-i386/Packages.gz

Package: zziplib-bin\n 
Priority: optional\n 
Section: utils\n 
Installed-Size: 116\n 
Maintainer: LIU Qi <[email protected]>\n 
Architecture: i386\n 
Source: zziplib (0.13.56-1)\n 
Version: 0.13.56-1+b1\n 
...\n 
\n 
Package: zzuf\n 
Priority: optional\n 
Section: devel\n 
Installed-Size: 228\n 
Maintainer: Sam Hocevar <[email protected]>\n 
Architecture: i386\n 
Version: 0.13.svn20100215-2\n 
...\n 
\n 

ZCAT输出也许任何你曾经做过这个

这应该最好是这样的:

{ 
"zziplib-bin": {"Version": "0.13.56-1+b1"}, 
"zzuf": {"Version": "0.13.svn20100215-2"}, 
... 
} 

- Timo

回答

0

我想通了。也许有人可以提出更好的建议。

a = zcat_output.split('\n\n') 
a.pop(len(a)-1) 
c = dict() 
for x in [x.splitlines() for x in a]: 
    pkg = "" 
    for y in [y for y in x if y.startswith('Package:') or y.startswith('Version:')]: 
     z = y.split(':') 
     if z[0] == 'Package': 
      pkg = z[1].strip() 
     else: 
      c[pkg] = {z[0]: z[1].strip()} 

print c.get('whois') 

输出:

{'Version': '5.0.10'} 
2

在Python中用\ n \ n分割字符串的最简单方法是什么?

使用.split

>>> "a\n\nb\n\n\nc".split("\n\n") 
['a', 'b', '\nc'] 
1

下面的脚本将读取Packages.gz等文件直接使用python的模块的gzip解压缩,所以应该节省您不必使用ZCAT的额外步骤。然后在分割'\n\n'之后,它会遍历每个包的详细信息,并使用正则表达式提取包名和版本。我为数据结构提供了两个存储包及其版本信息的实现。第二个是遵循你的问题中提到的结构,第一个是将每个包名映射到它的版本的更平坦的结构。

import gzip, re 
packages = gzip.open('Packages.gz', 'rb').read() 
p = packages.strip().split('\n\n') 
pack = re.compile('^Package: (.*)') 
ver = re.compile('\nVersion: (.*)') 

info = dict([(pack.findall(i)[0], ver.findall(i)[0]) for i in p]) 
print info['whois'] 

info = dict([(pack.findall(i)[0], {'Version': ver.findall(i)[0]}) for i in p]) 
print info['whois'] 

输出

5.0.10 
{'Version': '5.0.10'}