Sortierte Ausgabe in eine Datei

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
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Hallo,
ich habe folgendes Problem:

ich möchte bestimmte Daten aus einer Datei auslesen und diese in eine neue Datei speichern, dabei soll eine bestimmt Reihenfolge eingehalten werden und zwar wie sie in sorted_list vorhanden ist.
Hier mein (abgespeckter) Code:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

sorted_list = ['18693', '18625', '18560', '18634', '18593', '18549', '18619', '18585', '18597', '18595', '18583', '18594', '18569', '18692', '18576', '18579', '18548', '18578', '18566', '18587', '18584', '18596', '18556', '18621', '18635', '18539', '18620', '18618', '18612', '18614', '18613', '18610', '18615', '18616', '18611', '18538', '18574', '18598', '18567', '18557', '18572', '18592', '18577', '18565', '18575', '18617', '18606', '18608', '18607', '18604', '18636', '18609', '18602', '18603', '18605', '18637', '18590', '18591', '18573', '18600', '18589', '18582', '18580', '18571', '18581', '18588', '18601', '18537', '18586', '18599', '18559']

with open("boundary_values_step_0.01_cycle_1.dat","r") as infile:
     with open("output.dat",'w') as outfile:
        nodes     = []
        pressure = []
        xcoord    = []
        ycoord    = []
        zcoord    = []


        data = infile.readlines()
        #print data
        for entry in data:
            values = entry.split()
            if values[2] == "1":
                for knoten in sorted_list:
                    if knoten == values[3]:
                        #print knoten
                        pressure_node = float(values[6]) * (-1.0)
                        #print pressure_node
                        x_coord_node  = values[11]
                        y_coord_node  = values[12]
                        z_coord_node  = values[13]

                        pressure.append(pressure_node)
                        xcoord.append(x_coord_node)
                        ycoord.append(y_coord_node)
                        zcoord.append(z_coord_node)
                            
                        outfile.write('{0:2s}  {1:3f}  {2:4s}  {3:5s}  {4:6s}\n'.format(knoten,pressure_node,x_coord_node,y_coord_node,z_coord_node))

Wenn ich das nun laufen lassen, wird die Reihenfolge nicht eingehalten. In sorted_list folgt dem u.a. dem Eintrag '18557' die '18565',
in der Datei output.dat folgt dem Eintrag '18557' die '18559',
Hat jemand eine Idee, wie ich das hinbekomme?

Gruß
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo recnice,

Du benutzt auch die Reihenfolge wie sie in der Datei boundary_values_step_0.01_cycle_1.dat steht.
Willst Du die Sortierung wie sorted_list, mußt Du erst die gesamte Datei einlesen (am Besten in ein dict mit Key value[3])
und danach die Ausgabedatei in der Reihenfolge von sorted_list schreiben.

Grüße
Sirius
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Hi,
danke für die Antwort. Hast du für
erst die gesamte Datei einlesen (am Besten in ein dict mit Key value[3])
vielleicht einen Codeschnipsel....


Gruß
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

boundary_values = {}
with open("boundary_values_step_0.01_cycle_1.dat","r") as infile:
    for entry in infile:
        values = entry.split()
        if values[2] == "1":
            boundary_values[values[3]] = values
oder

Code: Alles auswählen

with open("boundary_values_step_0.01_cycle_1.dat","r") as infile:
    boundary_values = dict((values[3], values) for values in map(str.split, infile) if values[2] == '1')
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Super, das hilft!

Danke & Gruß
Antworten