Seite 1 von 1

Löschen bestimmter Bereiche im String

Verfasst: Freitag 11. Juli 2014, 14:43
von geograph
Hallo zusammen,

Ich habe mehrere Strings mit Koordinaten die folgendermaßen aufgebaut sind: "x1-Koordinate y1-Koordinate z1-Koordinate x2-Koordinate y2-Koordinate z2-Koordinate x3-Koordinate ...."

Konkret sieht einer dieser Strings folgendermaßen aus: "30.0 0.0 0.0 30.0 30.0 0.0 50.0 30.0 0.0 50.0 0.0 0.0"

Die Koordinaten liegen also alle in einem String und werden jeweils durch ein Leerzeichen voneinander getrennt.

Ich möchte nun die Fläche der x-y-Ebene berechnen und dafür brauche ich nur die x- und y-Koordinate. Aus diesem Grund möchte ich die z-Koordinaten aus dem String löschen.


Ich weiß jetzt nicht, wie ich an dieses Problem am besten herangehen soll. Ich hatte mir überlegt, alle Einträge zwischen dem zweiten und dritten Leerzeichen zu löschen, dann wiederum zwischen dem fünften und sechsten Leerzeichen usw. Nur weiß ich nicht wie ich das lösen könnte.

Ich würde mich freuen wenn ihr mir ein paar Tipps geben könntet.

Danke!

Re: Löschen bestimmter Bereiche im String

Verfasst: Freitag 11. Juli 2014, 14:47
von Hyperion
geograph hat geschrieben: Ich möchte nun die Fläche der x-y-Ebene berechnen und dafür brauche ich nur die x- und y-Koordinate. Aus diesem Grund möchte ich die z-Koordinaten aus dem String löschen.
Wieso willst Du auf dem String operieren? Für das Rechnen musst Du den String eh parsen und die Werte in Zahlen überführen. Das Parsen geht ja einfach mittels ``string.split``-Methode. Mittels Slicing kannst Du dann die Werte wählen, die Du Konvertieren willst. Die hinteren ignorierst Du dann einfach.

Z.B. so (ungetestet):

Code: Alles auswählen

data = "30.0 0.0 0.0 30.0 30.0 0.0 50.0 30.0 0.0 50.0 0.0 0.0"
coordinates = [float(value) for value in data.split()[:6]]
Edit: Oops, zu schnell gelesen! Vergiss es. Man muss ja Werte zwischendurch wählen... mein Ansatz ist also falsch! momentchen!

Re: Löschen bestimmter Bereiche im String

Verfasst: Freitag 11. Juli 2014, 15:01
von Hyperion
Du kannst das Rezept für eine Funktion ``grouper`` aus dem ``itertools``-Modul nutzen:

Code: Alles auswählen

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

[v for v in grouper(data.split(), 3)]
>[('30.0', '0.0', '0.0'),
 ('30.0', '30.0', '0.0'),
 ('50.0', '30.0', '0.0'),
 ('50.0', '0.0', '0.0')]

# und dann nur x + y:
[[x, y] for x, y, _ in grouper(data.split(), 3)]
> [['30.0', '0.0'], ['30.0', '30.0'], ['50.0', '30.0'], ['50.0', '0.0']]

Re: Löschen bestimmter Bereiche im String

Verfasst: Freitag 11. Juli 2014, 15:09
von geograph
SUPER! Danke dir! Hat geklappt!

Re: Löschen bestimmter Bereiche im String

Verfasst: Freitag 11. Juli 2014, 15:11
von Hyperion
Wenn Du viel mit solchen Daten zu tun hast, solltest Du Dir mal ``numpy`` angucken; ich vermute da gibt es solche Dinge out-of-the-box :-)

Re: Löschen bestimmter Bereiche im String

Verfasst: Freitag 11. Juli 2014, 15:16
von geograph
Ja, das könnte eine Hilfe sein. Schau ich mir mal bei Gelegenheit an. Danke dir.

Re: Löschen bestimmter Bereiche im String

Verfasst: Dienstag 20. Oktober 2015, 19:56
von Kahnbein.Kai
Hallo Hyperion,
bei mir sollen vorne und hinten Teile von einer Liste abgeschnitten werden. Hierfür ist Slicing doch das richtige oder?
Die Nummern sehen Beispielsweise so aus,
12341789.321567891.007 (Ist nur ein Beispiel, die richtigen haben andere Ziffern, diese habe ich aber gerade nicht hier)
von der Zeile soll nur 1789.321567 übrig bleiben.
Der Code sieht wie folgt aus,

Code: Alles auswählen

a=open("HALL_GES.txt","r")
b=open("HALL_GESB.txt","w")

for line in a:
    c=line[4:15]
    print(c)
    b.write(c)
            
a.close()
b.close()
Im Python Shell ist auch alles richtig Dargestellt.

Code: Alles auswählen

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
1789.321567
2789.321567
3789.321567
4789.321567
5789.321567
6789.321567
7789.321567
8789.321567
9789.321567
0789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
>>> 
In der Textdatei die neu erzeugt wird, ist alles in in einer Zeile dargestellt.

Code: Alles auswählen

1789.3215672789.3215673789.3215674789.3215675789.3215676789.3215677789.3215678789.3215679789.3215670789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.321567
Ich habe leider überhaupt keine Ahnung wie ich dort ein Zeilenumbruch erzwingen kann. Zu Zeilenumbrüchen speziell in for-Schleifen finde ich nichts.

Gruß Kai

Re: Löschen bestimmter Bereiche im String

Verfasst: Dienstag 20. Oktober 2015, 20:01
von cofi
Der Zeilenumbruch hat nichts mit der Schleife zu tun, darum kannst du da natuerlich auch nichts finden ;)

Das Problem ist, dass du nur diese Zahlen in die Datei schreibst und damit eben keinen Zeilenumbruch, was `print` jedoch implizit hinzufuegt.

Code: Alles auswählen

with open("HALL_GES.txt","r") as a, open("HALL_GESB.txt","w") as b:
    for line in a:
        b.write(line[4:15] + '\n')

Re: Löschen bestimmter Bereiche im String

Verfasst: Donnerstag 22. Oktober 2015, 15:57
von Kahnbein.Kai
Super, Danke für den Tipp, hat funktioniert !

Gruß Kai