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

String kürzen

Beitragvon macpes » 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:

Re: String kürzen

Beitragvon joerg » 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

Danke!

Beitragvon macpes » 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

Re: String kürzen

Beitragvon wusa » 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=python file=Untitled.py]
def radioname():
str_pad = " " * 16
radioname = os.system("mpc -f %name% current")
radioname = str(radioname)
radioname = str_pad + radioname
print radioname
[/code]

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=python file=Untitled.py]
ANTENNE BAYERN: ANTENNE BAYERN - Wir lieben Bayern, wir lieben die Hits
0[/code]
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:

Re: String kürzen

Beitragvon mutetella » 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

Re: String kürzen

Beitragvon wusa » 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=python file=Untitled.py]
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)[/code]

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

Re: String kürzen

Beitragvon 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

Re: String kürzen

Beitragvon wusa » 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

Re: String kürzen

Beitragvon 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

Re: String kürzen

Beitragvon wusa » 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

Re: String kürzen

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

Re: String kürzen

Beitragvon mutetella » 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

Re: String kürzen

Beitragvon 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

Re: String kürzen

Beitragvon wusa » 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

Re: String kürzen

Beitragvon wusa » 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=python file=Untitled.py]
import subprocess

command = subprocess.Popen(['ls'], stdout=subprocess.PIPE)[/code]

bei mir Eingebe, das Programm ausführbar mache und dann ps -a | less aufrufe, kommt folgendes:

[code=python file=Untitled.py]
!ps -a | less

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


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

Mache ich was falsch?

Wer ist online?

Mitglieder in diesem Forum: hatschy