--On Dienstag, Februar 15, 2011 08:56:50 +0100 Denny Schierz
<[email protected]> wrote:
[...]
Einträge raus. Doch mich würde interessieren, wie ich die Leerzeilen
bereits beim befüllen der Liste vermeiden kann. Da mir das schon wieder
wie ein Hack vorkommt:
============
./test2.py
[..]
('VM :', 18, '/vmfs/volumes/4c52874b-05f0/vm5/vm5.vmx')
('VM :', 19, '/vmfs/volumes/4c52874b-05f0/cluster_1/cluster_1.vmx')
('VM :', 20, '/vmfs/volumes/4c52874b-05f0/cluster_2/cl_2.vmx')
('VM :', 21, '')
('VM :', 22, '')
da man nicht weiß, wie lang die Liste wird, kann man diese nicht
explizit mit del 21,22 angehen.
Die beiden Newlines kommen schon vom vmware-cmd Kommando:
# vmware-vmd -s listvms | od -taz
[...]
0002620 a d / c l u s t e r _ 2 / c l u
ad/cluster_2/clu<
0002640 s t e r _ 2 . v m x nl nl
ster_2.vmx..<
0002654
Meine ersten Anfänge sehen so aus (2 Bücher + Google)
=========================
# !/usr/bin/python2.5
# imports
from optparse import OptionParser
from subprocess import Popen, PIPE, STDOUT
# Definitionen
def list_vm(choice):
list = Popen(['vmware-cmd','-s', 'listvms'], stdout=PIPE,
stdin=PIPE, stderr=STDOUT).communicate()[0].split('\n')
Du solltest 'list' nicht überschreiben, da es eine eingebaute Funktion
list() gibt.
#list.reverse()
#del list[:2]
if choice == 0:
for index in range(len(list)):
In python iteriert man eher so über listen:
for entry in mylist:
print mylist.index(entry), entry
wobei <list>.index() immer den ersten Eintrag in einer Liste findet, es
also nicht funktioneiert, wenn die Liste Duplikate enthält. Dann würde
ich
eher
for (index, line) in enumerate(mylist):
...
nehmen.
print("VM :",index, list[index])
else:
print("VM:", list[choice])
choice = 0
list_vm(0)
==========================
Wie bekomme ich die überflüssigen \nl da nun raus?
Du kannst den Leerzeichen, Tabs und \n and den Enden des Strings entfernen:
output = ...
output.strip()
oder besser mit einer "list comprehension" [1] alle leeren Eintrage
entfernen und Leerzeichen an den Enden entfernen:
filtered = [line.strip() for line in mylist if line.strip()]
Wenn Du sicher bist, dass die einzelnen Zeilen wie in Deinem Beispiel kein
Leerzeichen enthalten geht auch
filtered = [line for line in mylist if line]
..Carsten
ps: in python ist es üblich, mit 4 Leerzeichen einzurücken.
[1]
<http://docs.python.org/tutorial/datastructures.html#list-comprehensions>
--
----------------------------------------------------------------------------
PUG - Penguin User Group Wiesbaden - http://www.pug.org