Auslesen bestimmter Werte aus einer Textdatei

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
YviDee
User
Beiträge: 3
Registriert: Dienstag 2. Juli 2013, 07:56

Hallo,
bin absoluter Beginner, aber vielleicht kann mir jemand helfen. Ich möchte bestimmte Koordinaten aus einer txt. Datei lesen. Das hab ich schon:

.....

Code: Alles auswählen

points_to_search=(["p1_rw", "p1_hw","p2_rw", "p2_hw", "p4_rw", "p4_hw" , "p6_rw", "p6_hw" , "p7_rw", "p7_hw", "p9_rw", "p9_hw"])
#Hilfszähler
i = 0
#Lesen der einzelnen Zeilen
for line in textfile:
    #nach den Punkten aus dem Array suchen
    for point in points_to_search:
        try:    
            #Suchen des entsprechenden Strings und speichern der Position
            index_pts = line.index(points_to_search[i])
            #Suchen des nächsten Gleichheitszeichen
            index_pts_equalsign = line.index('=', index_pts)
            #Suchen nach Ende
            [b]index_pts_ende = line.index('.', index_pts_equalsign)[/b]
            #Auslesen des Strings nach dem Gleichheitszeichen bis zum nächsten Whitespace
            #Gleichzeitig wird in Fließkommazahl umgewandelt
            Value = float(line[index_pts_equalsign+1:index_pts_ende])
            #Ausspucken der Werte
            print points_to_search[i] + "=" + str(Value)
            i += 1
....
Der Textfile sieht so aus:
.....p1_rw=3336940.16p1_hw=5676341.30p1_sp=201p1_ze=9098.....
...
Das Problem ist das Ende! Ich will die ganze Zahl und nicht bis zum Punkt. Da hier alles ohne Leerzeichen geschrieben ist bekomme ich das nicht hin. Wenn ich statt '.' 'p' schreibe funktioniert das nicht. Ich habe auch schon versucht es mit der Anzahl der Stellen zu versuchen, aber dafür bin ich wohl zu blöd...
Zuletzt geändert von Anonymous am Dienstag 2. Juli 2013, 08:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@YviDee: Man sollte ja nicht auf alles reguläre Ausdrücke schmeissen, aber hier wäre das `re`-Modul wohl besser als die Zeilen umständlich „per Hand” auseinander zu nehmen.

Schreib dir eine Funktion die eine Zeile in ein Wörterbuch (`dict`) mit Schlüssel/Wert-Paaren zerlegt, und suche Dir dann die gewünschten Werte dort heraus.

Das `i` ist übrigens überflüssig — überlege doch mal was `point` für einen Wert hat, und warum Du den nirgends verwendest. Ausserdem wird das `i` wohl an der falschen Stelle an 0 gebunden.

Edit:

Code: Alles auswählen

#!/usr/bin/env python
import re
from itertools import product

KEY_VALUE_RE = re.compile(r'([a-z_][a-z0-9_]*)=(\d+(?:\.\d*)?)')


def main():
    points_to_search = [
        'p{0}_{1}w'.format(a, b) for a, b in product([1, 2, 4, 6, 7, 9], 'rh')
    ]
    with open('test.txt') as lines:
        for line in lines:
            variables = dict(
                (k, float(v)) for k, v in KEY_VALUE_RE.findall(line)
            )
            for point in points_to_search:
                value = variables.get(point)
                if value is not None:
                    print '{0} = {1}'.format(point, value)


if __name__ == '__main__':
    main()
YviDee
User
Beiträge: 3
Registriert: Dienstag 2. Juli 2013, 07:56

Ach was! - Vielen dank, dass macht in der Tat Sinn und hat sogar geklappt!
YviDee
User
Beiträge: 3
Registriert: Dienstag 2. Juli 2013, 07:56

Hallo ich bin es nochmal. Die Werte brauche ich, um in ArcGIS ein Polygon zu erstellen, deshalb habe ich das o.g. Script ein wenig angepasst:

Code: Alles auswählen

import arcpy
import re

from itertools import product
pnt = arcpy.Point()
KEY_VALUE_RE = re.compile(r'([a-z_][a-z0-9_]*)=(\d+(?:\.\d*)?)')

def main():
    points_to_search_r = [
        'p{0}_{1}w'.format(a, b) for a, b in product([1, 2, 4, 6, 7, 9], 'r')
    ] 
    points_to_search_h = [
        'p{0}_{1}w'.format(a, b) for a, b in product([1, 2, 4, 6, 7, 9], 'h')
    ]      
    with open('F:\\Rasterdaten\\SRV\\2005\\TK100\\c4706_3.txt') as lines:
        for line in lines:
            variables = dict(
                (k, float(v)) for k, v in KEY_VALUE_RE.findall(line)
            )
            for point_r in points_to_search_r:
                value_r = variables.get(point_r)
                if value_r is not None:
                    #print '{0} {1}'.format(point_r, value_r)
                    pnt.Y = value_r
                    #print pnt.Y
                    
            for point_h in points_to_search_h:
                value_h = variables.get(point_h)
                if value_h is not None:
                    #print '{0} {1}'.format(point_h, value_h)
                    pnt.X = value_h
                    #print pnt.X
                    
if __name__ == '__main__':
    main()
Etwas ganz ähnliches habe ich bereits mal mit eine dbf (Tabelle) gemacht, das sah dann so aus und hat auch funktioniert:

Code: Alles auswählen

import arcpy

arcpy.env.overwriteOutput=1
arcpy.env.workspace = "E:\\mxd\\Shapefiles\\"
arcpy.CreateFeatureclass_management(arcpy.env.workspace, "test_polygon.shp","POLYGON")
cur=arcpy.InsertCursor("test_polygon.shp")
lineArray = arcpy.Array()
pnt = arcpy.Point()
cur2 = arcpy.SearchCursor("F:\Rasterdaten\SRV\\gps_points.dbf")

for row in cur2:

    pnt.X = row.getValue("x")
    pnt.Y = row.getValue("y")

    lineArray.add(pnt)

feat = cur.newRow()
feat.shape = lineArray
cur.insertRow(feat)
print "Berechnung beendet"

del cur
del cur2
del row
Wie bekomme ich jetzt den oberen Teil in den unteren integriert, geht das überhaupt? Ich weiß nicht ob ich in Textdateien einen Cursor verwenden kann.

und zu guter Letzt, was bedeutet eigentlich:

Code: Alles auswählen

if __name__ == '__main__':
    main()
und bin ich überhaupt im richtigen Forum?

LG
YviDee
Antworten