Seite 1 von 1

Spalten in eine Datei schreiben

Verfasst: Montag 16. Januar 2012, 13:31
von recnice
Hallo,

Ich möche eine Skript scheiben, dass eine bestimmte Datei öffnet, die eine bestimmte Anzahl an Zeilen und Spalten hat.
Das Skript soll nun für jede Zeile die Werte der Spalten 3 & 6 auslesen und dann in ein neues File speichern.

Hier mein vorläufiger Code:

Code: Alles auswählen

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

node_list      = []
pressure_list = []


with open ("boundary_values.dat","r") as infile:
  data = infile.read().split("\n")
  infile.close

with open ("pressure_for_pandas.dat","w") as outfile:
  # remove empty entries
  data.remove('')

  for entry in data[:-1]:
    values = entry.split()
    #print values
    #print values[2]
    node_number = values[2]
    pressure    = values[5]
    node_list.append(node_number)
    pressure_list.append(pressure)

  for x in range(0,len(node_list)):
     outfile.write('{0:2s}  {1:3s}'.format(node_list[x],pressure_list[x]))
outfile.close()

Dieses Ergebnis hätte ich gerne in der neue Datei:
  • 4 9.103031130345E-002
    45 2.440419336346E-001
    44 2.700032800726E-001
    43 3.220914515662E-001
    42 3.705968601415E-001
    41 4.188176219559E-001
    40 4.662875052703E-001
    39 4.809249903730E-001
    3 6.289671033511E-001
    38 7.823184312784E-001
    37 7.534698386790E-001
    36 7.300203098699E-001
    35 7.190681098033E-001
    34 7.129156742286E-001
    33 7.084271725399E-001
    32 7.053586478139E-001
    2 7.046095821294E-001
Jedoch sieht mein Ergebnis so aus:
4 9.103031130345E-00245 2.440419336346E-00144 2.700032800726E-00143 3.220914515662E-00142 3.705968601415E-00141 4.188176219559E-00140 4.662875052703E-00139 .....
Hat jemand eine Idee, wo der Fehler liegen könnte! Oder gibt es auch noch weitere Verbesserungsvorschläge??

Gruß

Re: Spalten in eine Datei schreiben

Verfasst: Montag 16. Januar 2012, 13:52
von Rekrul
file.write(...) schreibt nicht jeden Wert in eine neue Zeile.

Du musst mit '...\n' selbst für den Zeilenumbruch sorgen.

Re: Spalten in eine Datei schreiben

Verfasst: Montag 16. Januar 2012, 13:53
von cofi
Ungetestet:

Code: Alles auswählen

with open("boundary_values.dat"), open("pressure_for_pandas.dat", "w") as infile, outfile:
  for line in infile:
      if line == "":
          continue
      values = line.split()
      node_number = values[2]
      pressure    = values[5]
      outfile.write('{0:2s}  {1:3s}\n'.format(node_number, pressure))
`.close` ist wegen `with` ueberfluessig und im ersten Fall wird es gar nicht aufgerufen.
Du brauchst deine Daten nie komplett sondern kannst sie als Stream verarbeiten.
Der naechste Schritt waere das csv Modul zu benutzen.

Re: Spalten in eine Datei schreiben

Verfasst: Montag 16. Januar 2012, 13:59
von recnice
Ja danke für die Hinweise!!

@ cofi:

Was meinst du mit
Du brauchst deine Daten nie komplett sondern kannst sie als Stream verarbeiten.
??

Nochmal Danke & Gruß

Re: Spalten in eine Datei schreiben

Verfasst: Montag 16. Januar 2012, 16:39
von cofi
Um einen Datensatz (= Zeile) zu verarbeiten brauchst du nie mehr als diesen Datensatz, d.h. du musst deine Eingabedatei nicht auf einen Schwung einlesen, sondern kannst es haeppchenweise tun. Das ist was ich mit "als Stream verarbeiten" meine.
Dasselbe ist auch der Hintergrund dafuer, dass du keinen Zwischenspeicher fuer die neuen Daten brauchst, sondern sie direkt schreiben kannst.

Drei Sachen noch:
- ``infile.read().split("\n")`` == ``infile.readlines()``
- ``for entry in data[:-1]:`` == ``for entry in data:``
- ``for x in range(len(list)):`` ist ein Anti-Pattern, hier kann man es noch verstehen, da du auf den gleichen Datensatz zugreifen willst, aber besser ist:

Code: Alles auswählen

from itertools import izip
for node,  pressure in izip(nodes, pressures):
    outfile.write(...)
Und den Typ im Namen zu kodieren (-> node_list) ist auch eine schlechte Idee, da Objekte typisiert sind, nicht Namen. D.h. in ``node_list`` koennte auch 42 stehen.