Aufsplitten von importierten Textzeilen

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
Centurion_82
User
Beiträge: 3
Registriert: Freitag 29. Januar 2010, 14:36

Hallo Forum.

Folgendes Problem habe ich beim Zerlegen einer importierten Textdatei.
Der Import und das Aufsplitten in einzelne Zeilen funktioniert.
Beim Aufsplitten der Zeilen in Spalten hakt es noch.
Das Problem ist, dass die Spalten in den ersten beiden Zeilen der Textdatei über ein "|" und in den nachfolgenden
Zeilen über ein Leerzeichen getrennt werden.
Die Zeile "li.append([ ....." habe ich vorerst auskommentiert.

Könnt ihr mir helfen? Und kann mir eines sagen, wie man hier Dateien hochladen kann?

#textfile.txt
10237 | Knoten unten
Frequenz | Displacement Z Magnitude | Reaction Force Z Magnitude
5 0.000625 177.552
15.101 0.000625 180.333
25.202 0.000625 184.088
35.303 0.000625 188.597

Code: Alles auswählen

import sys
try:
    d = open("textfile.txt")
except:
    print("Dateizugriff nicht erfolgreich")
    sys.exit(0)
gesamtertext = d.read()
d.close()

# Umwandeln in eine Liste von Zeilen
zeilenliste = gesamtertext.split(chr(10))

# Jede Zeile umwandeln in Liste von int, string, float
li = []
for zeile in zeilenliste:
    if zeile:
        zeile2=zeile.strip()
        zeile3=zeile2.replace(" "," ")        
        zwliste1 = zeile.split("|")
        print zwliste1
        #li.append([zwliste[0],zwliste[1],zwliste[2]])

# Ausgabe
for p in li:
    print p[0]+" "+p[1]+" "+p[2]
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Code: Alles auswählen

head = []
data = []
with open("textfile.txt") as datafile:
  for line in datafile:
    if '|' in line:
      head.append([value.strip() for value in line.split('|')])
    else:
      data.append([float(value) for value in line.split()])

if not head and not data:
  print "Missing or empty file"

for headline in head:
  print '%s %s %s' % headline
for dataline in data:
  print '%f %f %f' % dataline
Bottle: Micro Web Framework + Development Blog
Centurion_82
User
Beiträge: 3
Registriert: Freitag 29. Januar 2010, 14:36

Danke für die schnelle Antwort.
Vom Prinzip verstehe ich den Code schonmal.
Es erscheint folgende Fehlermeldung.

Traceback (most recent call last):
File "F:\Spielwiese\Forumbeitrag\Kopie von Textimport.py", line 13, in <module>
print '%s %s %s' % headline
TypeError: not enough arguments for format string
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mal als Denkanstoß:

Code: Alles auswählen

In [1]: data = ("foo", "bar")

In [2]: print "%s %s" % data
------> print("%s %s" % data)
foo bar

In [3]: data = ("foo")

In [4]: print "%s %s" % data
------> print("%s %s" % data)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/nelson/<ipython console> in <module>()

TypeError: not enough arguments for format string
Centurion_82
User
Beiträge: 3
Registriert: Freitag 29. Januar 2010, 14:36

Den Denkanstoß habe ich verstanden aber kann diesen aufgrund meiner geringen kenntnisse nicht umsetzen.
Ich habe einen Print Befehl beim Zerlegen eingebaut.

Code: Alles auswählen

head = [] 
data = [] 
with open("textfile2.txt") as datafile: 
  for line in datafile: 
    if '|' in line: 
      value=line.split('|')
      print value
      head.append([value.strip() for value in line.split('|')])
    else: 
      data.append([float(value) for value in line.split()])
Die Ausgabe sieht so aus:
['12345 ', ' Knoten unten ', ' dat\n']
['Frequenz ', ' Displacement Z Magnitude ', ' Reaction Force Z Magnitud\n']

Wie kann ich den Code entsprechend umbauen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das einfachste ist wohl

Code: Alles auswählen

print " ".join(value)
Es hängt natürlich davon ab, wie komplex die Ausgabe werden soll.
Das Leben ist wie ein Tennisball.
Antworten