Spalten in eine Datei schreiben

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 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ß
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

file.write(...) schreibt nicht jeden Wert in eine neue Zeile.

Du musst mit '...\n' selbst für den Zeilenumbruch sorgen.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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

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ß
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Antworten