String kürzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
macpes
User
Beiträge: 7
Registriert: Dienstag 13. Mai 2003, 08:24

Mittwoch 21. Mai 2003, 14:13

Hallo!

Ich möchte aus einem String die letzten zwei Buchstaben löschen.

Mit rstrip() kann ich ja nur Whitespaces und Buchstaben, welche ich der
Funktion übergebe, löschen. Da aber die letzten Buchstaben immer
andere sind hilft mir diese Funktion nicht weiter.

Gibt vielleicht eine andere Funktion mit der eine bestimmte Anzahl an
Stellen löschen kann bzw. einen Teilstring auslesen kann?

Gruß
Markus
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Mittwoch 21. Mai 2003, 16:04

Wenn s der String ist, ist s[:-2] der um die letzten beiden Buchstaben gekürzte String.

Jörg
macpes
User
Beiträge: 7
Registriert: Dienstag 13. Mai 2003, 08:24

Mittwoch 21. Mai 2003, 18:49

Danke!

Genau das habe ich gesucht. :D

Gruß
Markus
wusa
User
Beiträge: 21
Registriert: Dienstag 18. Februar 2014, 11:08

Dienstag 13. Januar 2015, 14:56

Hallo Zusammen,

auch wenn der Thread schon über 10 Jahre alt ist :shock: habe ich auch ein Problem mit dem String kürzen. Wollte daher keinen neuen Thread eröffnen.

Code: Alles auswählen

def radioname():
        str_pad = " " * 16
        radioname = os.system("mpc -f %name% current")
        radioname = str(radioname)
        radioname = str_pad + radioname
        print radioname
Die Ausgabe funktioniert auch... nur leider wird nicht der Radioname ausgegeben, sondern eine 0.

Lass ich mir das ganze über Print mal anzeigen, sieht es folgendermaßen aus:

Code: Alles auswählen

ANTENNE BAYERN: ANTENNE BAYERN - Wir lieben Bayern, wir lieben die Hits
0
Ich weiß leider nicht wie ich die 0 weg bekomme, bzw. soll die neue Zeile weg. Kann mir hier bitte jemand helfen?

Danke
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Dienstag 13. Januar 2015, 15:38

@wusa
Die ``0``, die Du bekommst ist der Rückgabewert von ``os.system``, das Du nicht mehr benutzen solltest. Verwende stattdessen das ``subprocess`` Modul:

Code: Alles auswählen

>>> import subprocess
>>> command = subprocess.Popen(['echo', 'any output'], stdout=subprocess.PIPE)
>>> out, err = command.communicate()
>>> print out
any output
Damit erhältst Du die Ausgabe, die Dein Programm nach ``stdout``, sprich die Konsole, schreibt.

Warum ``str_pad = ' ' * 16``? Dafür gibt es sicherlich eine bessere Möglichkeit. Schau' Dir mal ``str.format`` an.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
wusa
User
Beiträge: 21
Registriert: Dienstag 18. Februar 2014, 11:08

Dienstag 13. Januar 2015, 16:02

Danke.
Da das ganze über ein 2x16 Display läuft, wird das quasi aufgefüllt und dann über Radioname "durchgeschoben".

Ich werde das heute mal mit dem subprocess testen. Habe da aber leider noch keine Ahnung wie das geht.

Sollte sich aber auch ähnlich lösen lassen?

radioname = subprocess.Popen(["mpc -f %name% current"], stdout=subprocess.PIPE)?

Der ganze Code sieht so aus:

Code: Alles auswählen

def radioname():
        str_pad = " " * 16
        radioname = os.system("mpc -f %name% current")
        radioname = str(radioname)
        radioname = str_pad + radioname
        for i in range (0, len(radioname)):
                lcd_byte(DISPLAY_LINE_1, DISPLAY_CMD)
                lcd_text = radioname[i:(i+15)]
                lcd_string(lcd_text)
                time.sleep(0.6)
                lcd_byte(DISPLAY_LINE_1, DISPLAY_CMD)
                lcd_string(str_pad)
Edit: Gerade mal schnell Google "angeworfen" und habe diese Zeile gefunden.
text1 = subprocess.Popen(['mpc', 'current', '-f', '%artist%'], stdout=subprocess.PIPE).stdout.read().strip()

Mal sehen, ob es heute Abend so klappt.
BlackJack

Dienstag 13. Januar 2015, 16:26

@wusa: Selbst wenn das ”klappt”, dann klappt das nicht wirklich weil das bei jedem Aufruf einen Zombieprozess hinterlassen wird. Man muss von Prozessen den Rückgabecode abfragen, sonst bleibt der in der Prozessliste, auch wenn er beendet ist.
wusa
User
Beiträge: 21
Registriert: Dienstag 18. Februar 2014, 11:08

Dienstag 13. Januar 2015, 16:42

Das ist ja nur ein Programmteil.

Ich rufe mein Radio.py auf und lasse darin eine Schleife laufen.
Ein Teil von der Schleife ist unter anderem die Funktion Radioname()

Da rufe ich doch keinen Prozesse zusätzlich auf?

Und wenn es so sein sollte, kannst du mir sagen wie ich das unterbinde?
BlackJack

Dienstag 13. Januar 2015, 16:48

@wusa: Ähm, was denkst Du denn was `subprocess.Popen()` macht wenn nicht einen externen Prozess zu starten. ;-)
wusa
User
Beiträge: 21
Registriert: Dienstag 18. Februar 2014, 11:08

Dienstag 13. Januar 2015, 16:51

Ou :|

Selbst über die eigenen Füße gefallen.
Aber wie kann ich dann so etwas verhindern?
Wenn die Prozessliste vollläuft, dann denke ich wird es über kurz oder lang auf die Auslastung von dem ganzen Pi gehen?
BlackJack

Dienstag 13. Januar 2015, 19:34

@wusa: Wie schon gesagt Du musst den Rückgabecode von dem Prozess abfragen. Das geht mit der `wait()`-Methode. Oder Du benutzt `subprocess.check_output()`.
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Mittwoch 14. Januar 2015, 08:14

@BlackJack
Wenn wusa den Prozess mit ``communicate`` abfragt, so wie ich ihm das empfohlen habe, dann ist dieser doch auch beendet, oder täusche ich mich?

Code: Alles auswählen

In [1]: import subprocess

In [2]: command = subprocess.Popen(['ls'], stdout=subprocess.PIPE)

In [3]: !ps -a | less

  PID TTY          TIME CMD
...
32064 pts/7    00:00:00 ipython
32066 pts/7    00:00:00 ls <defunct>
32068 pts/7    00:00:00 bash
32069 pts/7    00:00:00 ps
32070 pts/7    00:00:00 less
(END)

In [4]: out, err = command.communicate()

In [5]: !ps -a | less

  PID TTY          TIME CMD
...
32109 pts/7    00:00:00 ipython
32114 pts/7    00:00:00 bash
32115 pts/7    00:00:00 ps
32116 pts/7    00:00:00 less
(END)
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

Mittwoch 14. Januar 2015, 10:26

@mutetella: Ja die Methode führt am Ende ein `wait()` aus.
wusa
User
Beiträge: 21
Registriert: Dienstag 18. Februar 2014, 11:08

Mittwoch 14. Januar 2015, 10:34

Vielen Dank für die Antworten. Ich habe gestern schon den Tipp mit "subprocess" umgesetzt.
Heute werde ich mich dann noch an diese Methode setzten.
wusa
User
Beiträge: 21
Registriert: Dienstag 18. Februar 2014, 11:08

Sonntag 25. Januar 2015, 17:43

Hallo Zusammen,

ich habe da mal ein paar Fragen zu dem Code von mutetella.

Wenn ich den Code:

Code: Alles auswählen

import subprocess
 
command = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
bei mir Eingebe, das Programm ausführbar mache und dann ps -a | less aufrufe, kommt folgendes:

Code: Alles auswählen

 
!ps -a | less

   PID TTY          TIME CMD
 2266 pts/0    00:00:00 ps
 2267 pts/0    00:00:00 less

Auch wenn ich in einem 2ten "Putty-Fenster" mir "top" anzeigen lasse, wir auch keine Zombie angezeigt.

Mache ich was falsch?
Antworten