--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

Antwort per Email an