Element suchen und referenzieren

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.
Antworten
Hermdaddy
User
Beiträge: 7
Registriert: Mittwoch 8. Mai 2019, 20:28

Hi!

Für ein kleines Projekt hab ich folgendes Problem:
meine Daten sind wie folgt aufgebaut

frame1, y-wert, x-wert, ID1, Object1, y-wert, x-wert, ID2, Object2,...
frame2, y-wert, x-wert, ID7, Object7, y-wert, x-wert, ID1, Object1,...

als Zahlenbeispiel:
1345, 50.000, 70.000, 9734, 9342, 20.000, 40.000, 52, 9523,...
1346, 10.000, -10.000, 41, 4314, 51.000, 69.000, 9734, 9342,...

Ich suche nun eine Möglichkeit, die ID zu suchen und mit ihm sowohl das frame als auch y-wert, x-wert und Object1 auszugeben.

ID und frame habe ich auch schon mit folgendem Code hinbekommen:

Code: Alles auswählen

with open("test_text.txt") as f:
    with open("58a.txt", "w") as f1:
        for line in f:
            if "9734," in line:
                f1.write(' 9734 ' + line[0:5])        
Ab jetzt hakt es bei mir, da die ID's auch an unterschiedlichen Stellen in der txt-Datei vorhanden sein können.
Meine Ansätze waren bislang entweder regex, aber...puh. Oder die komplette Datei in ein Array schreiben und von der ID ausgehend 1 und 2 Elemente nach hinten und 1 Element nach vorn schauen und in die neue txt-Datei schreiben.

Ich hoffe ihr könnt mir ein wenig auf die Sprünge helfen.

Danke im Voraus!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich würde ja einfach zum Lesen und Schreiben das csv-Modul verwenden.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast eine csv-Datei. Diese lädt man mit dem csv-Modul. Da Du anscheinend viele Daten hast, wäre pandas was für Dich. Das vereinfacht die Suche in bestimmten Spalten noch mehr.
Je nachdem, wie viel Datenverarbeitung Du machst, ist es sehr wahrscheinlich sinnvoll, die Daten umzustrukturieren, dass Du eine Tabelle mit Frame, ID, Objekt, x, y hast und nicht alle Objekte in einer Zeile.
Hermdaddy
User
Beiträge: 7
Registriert: Mittwoch 8. Mai 2019, 20:28

Okay, danke erst einmal für eure Hinweise.
Eine Umstrukturierung habe ich mir auch schon überlegt, weiß aber nicht wie sinnvoll das ist. In einer Zeile sind manchmal 3 solcher Fragmente, manchmal 21. Insgesamt habe ich circa 34.000 Zeilen davon...

Das Endprodukt soll dann so aussehen:

frame ID Objekt x, y

2545, 53, 1999, 50, 30
2546, 53, 1999, 49, 31
2548, 53, 1999, 48, 31.3
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hallo Hermdaddy,

wenn es keine klare Tabellenstruktur gibt, wird es mit csv schwierig.
Man muss sich halt auf bestimmte Gesetzmäßigkeiten verlassen können um die Daten zu ordnen.

Laut deinem Beispiel fängt jede Zeile mit dem frame an. Danach kommen dann 3 bis ca. 21 4er-Pakete die jeweils y-wert, x-wert, ID, Object enthalten. (ich hoffe immer in der gleichen Reihenfolge)

Damit könnte man arbeiten:
element_list = line.split(',') zerlegt eine Zeile in eine Liste aus einzelnen Elementen. Dabei ist das Komma natürlich das Trennszeichen.
Eventuell musst du dann noch Leerzeichen entfernen.

Jetzt kannst du mit ein wenig Mathematik darauf rückschließen wo sich die jeweiligen Elemente befinden.
element_list[0] würde also immer den frame enthalten (Vorausgesetzt meine Annahme war richtig)

element_list[1], element_list[5], usw., alle y-Werte

oder mit:
element_list[1:5] bekommst du einen Teil der Elemente, nämlich vom Index 1 bis 4.

Ich denke, denn Rest bekommst du hin.
Hermdaddy
User
Beiträge: 7
Registriert: Mittwoch 8. Mai 2019, 20:28

Hi rogerb,

danke für deine Antwort.
Die Reihenfolge frame, y,x,ID1,Object1,... ist stets gleich, nur ist das "paket" von ID1 mal an Stelle 6, mal an Stelle 14, mal an Stelle 1. Da gibt es leider keine Gesetzmäßigkeit und genau das ist das Problem. Die ID mitsamt y,x,Object ist immer woanders in den jeweiligen Zeilen.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hermdaddy: Also sind das keine Gruppen von vier Werten? Was ist denn da die Bedeutung von Werten ausserhalb von solchen Gruppen? Und warum gibt es da keine Gesetzmässigkeit? Wie ist denn sichergestellt, dass eine Zahl eine ID ist? Wenn Du einfach nach einer ID suchst, kann es ja sein, dass Du auch genau diesen Wert findest, der aber was anderes bedeutet, und entsprechend die Zahlen davor und danach kein Objekt und keine Koordinaten sind‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Hermdaddy
User
Beiträge: 7
Registriert: Mittwoch 8. Mai 2019, 20:28

Bild

So ist die Datei aufgebaut, die erste Spalte mit dem frame ist hier nicht sichtbar.
Jede ID bildet eine Gruppe, dahinter kommt das Object, davor die beiden Koordinaten. Warum es keine Gesetzmäßigkeiten in der Reihenfolge der IDs gibt, weiß ich nicht. Am Beispiel der 9734 ist das ja gut ersichtlich. Erst ist sie in Spalte I, danach in Spalte M.
Die ursprüngliche Datei ist eine json-Datei, damit kenne ich mich nur leider überhaupt nicht aus. Ich dachte, mit notepad, excel und python bekomme ich das schön geordnet.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie sieht denn die json-Datei aus? Das ist dann schon der richtige Input, weil in json noch mehr Strukturinformation drin ist.
Hermdaddy
User
Beiträge: 7
Registriert: Mittwoch 8. Mai 2019, 20:28

Code: Alles auswählen

"frame": 1150, "data": [{"y": 0.938547275141, "x": -1.09102306177, "trackable_object": 1308, "track_id": 6}, {"y": -5.69902573468, "x": -12.0135373299, "trackable_object": 5578, "track_id": 7}, {"y": 10.1627958754, "x": -25.5889702349, "group_name": "away team", "track_id": 9}, {"y": -3.66061778692, "x": -15.2772858891, "trackable_object": 5595, "track_id": 13}, {"y": -10.76232891, "x": -25.9077645834, "trackable_object": 6617, "track_id": 12}, {"y": 5.78354325721, "x": 8.11753598936, "trackable_object": 6168, "track_id": 11}, {"y": -13.5860110021, "x": 0.330776769972, "group_name": "home team", "track_id": 8}, {"y": -29.8414238519, "x": 0.881446347935, "trackable_object": 5932, "track_id": 4}, {"y": -31.9656868073, "x": -20.3087581959, "trackable_object": 11559, "track_id": 3}, {"y": -23.2367005003, "x": 13.4152303994, "trackable_object": 18099, "track_id": 2}, {"y": -20.9354269146, "x": -5.4460860091, "trackable_object": 12950, "track_id": 1}, {"y": -11.7185425192, "x": 4.96432480165, "trackable_object": 22396, "track_id": 14}], "period": null, "time": null}, {"possession": {"trackable_object": null, "group": null}, 
"frame": 1151, "data": [{"y": 0.981349973765, "x": -0.884353533093, "trackable_object": 10318, "track_id": 6}, {"y": -5.48530503648, "x": -11.6994150918, "trackable_object": 5578, "track_id": 7}, {"y": 9.93974997164, "x": -25.546448277, "group_name": "away team", "track_id": 9}, {"y": -3.77276040817, "x": -14.9195661773, "trackable_object": 5595, "track_id": 13}, {"y": -10.7440479435, "x": -25.696294208, "trackable_object": 6617, "track_id": 12}, {"y": 5.46168710465, "x": 8.3755429146, "trackable_object": 6168, "track_id": 11}, {"y": -13.6288838404, "x": 0.466471433832, "group_name": "home team", "track_id": 8}, {"y": -29.9726282778, "x": 1.00383445472, "trackable_object": 5932, "track_id": 4}, {"y": -31.6037319868, "x": -20.2904503315, "trackable_object": 11559, "track_id": 3}, {"y": -23.4157765998, "x": 13.4824726184, "trackable_object": 18099, "track_id": 2}, {"y": -20.9688427849, "x": -5.17165831401, "trackable_object": 12950, "track_id": 1}, {"y": -11.7790625449, "x": 5.12505371292, "trackable_object": 22396, "track_id": 14}], "period": null, "time": null}, {"possession": {"trackable_object": null, "group": null}, 
"frame": 1152, "data": [{"y": 15.6622046397, "x": 2.35283202208, "trackable_object": 9734, "track_id": 18}, {"y": 0.983387562872, "x": -0.750181491486, "trackable_object": 10318, "track_id": 6}, {"y": 3.25729236385, "x": -7.76529594424, "trackable_object": 6900, "track_id": 15}, {"y": -5.35247459645, "x": -11.4165468273, "trackable_object": 5578, "track_id": 7}, {"y": 4.21985157258, "x": -24.1183347391, "trackable_object": 7217, "track_id": 16}, {"y": 9.86807044263, "x": -25.4330758384, "group_name": "away team", "track_id": 9}, {"y": -3.85674747552, "x": -14.6275503572, "trackable_object": 5595, "track_id": 13}, {"y": -10.7415729707, "x": -25.5176036625, "trackable_object": 6617, "track_id": 12}, {"y": 5.23891018847, "x": 8.55008057584, "trackable_object": 6168, "track_id": 11}, {"y": -13.6565564272, "x": 0.551087471604, "group_name": "home team", "track_id": 8}, {"y": -30.0879337266, "x": 1.08070527442, "trackable_object": 5932, "track_id": 4}, {"y": -31.2920345312, "x": -20.2621639002, "trackable_object": 11559, "track_id": 3}, {"y": -23.5241873851, "x": 13.5309558138, "trackable_object": 18099, "track_id": 2}, {"y": -20.9960832961, "x": -4.94404078042, "trackable_object": 12950, "track_id": 1}, {"y": -11.8306309748, "x": 5.2362121205, "trackable_object": 22396, "track_id": 14}], "period": null, "time": null}, {"possession": {"trackable_object": null, "group": null}, 
okay, dann sind das hier die ersten drei Zeilen.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo ist das Problem, mit dieser Struktur zu arbeiten?
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hermdaddy: Arbeite mit den JSON-Daten statt die plattzuklopfen und dann Informationen zur Struktur zu verlieren.

Die Ausschnitte/Zeilen selbst sind ja kein gültiges/vollständiges JSON, darum kann man jetzt schlecht sagen wie Du an das JSON-Objekt heran kommst in dem die Daten "frame" und "data" stecken, aber wenn Du die erst einmal in den Fingern hast, ist das ja recht trivial die Infos da auszulesen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hermdaddy hat geschrieben: Montag 17. Mai 2021, 15:03 Die ursprüngliche Datei ist eine json-Datei, damit kenne ich mich nur leider überhaupt nicht aus. Ich dachte, mit notepad, excel und python bekomme ich das schön geordnet.
JSON-Dateien sind in Python sehr einfach zu benutzen. Die kurze Einarbeitungszeit ist sicher gut investiert. Da findet man auch tonnenweise Infos im Netz:

Leider fehlt bei dem von dir geposteten Ausschnitt einiges an Information.

Daher mal als Beispiel und unter der Annahme, dass die Datei nur aus der ersten Zeile bestehen würde:
(Also den Teil mit "possession" weggelassen und dann einmal {} - Klammern drum)

Code: Alles auswählen

import json

json_filename = "data.json"

with open(json_filename, "r") as json_file:
    json_data = json.load(json_file)


def get_trackable_object(object_list, object_id):
    for object_group in object_list["data"]:
        if object_id == object_group.get("trackable_object"):
            return object_group
    else:
        raise Exception("Object not found")
        # Oder was immer passieren soll wenn die gesuchte ID nicht vorhanden ist


found_object = get_trackable_object(json_data, 10318)

# Ausgabe in der Konsole oder was auch immer du mit den Daten machen willst:
print(found_object)
Ausgabe:
{'y': 0.983387562872, 'x': -0.750181491486, 'trackable_object': 10318, 'track_id': 6}


Das ist natürlich nur ein Beispiel aber ich hoffe der Ansatz hilf schon mal
Hermdaddy
User
Beiträge: 7
Registriert: Mittwoch 8. Mai 2019, 20:28

Herzlichen Dank für die Antworten!

Das ist das Tolle an solchen Foren... Der Fragesteller verirrt sich in seinen Gedankengängen total und ist auf dem Holzweg, und dann kommen fähige Leute und geben Ratschläge, um auf den richtigen Weg zugelangen!
Ich zieh mir dann erstmal paar Tutorials und kleinere Übungen rein, vielleicht melde ich mich noch einmal! Habt tausend Dank.
Antworten