gezieltes einlesen von daten aus 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
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Freitag 17. März 2006, 11:41

Hallo Leute!

Wie sieht ein Skript aus, in welchem ich nur einen gewissen Teil einer Datei (read.txt)einlese?

Alles zwischen <data> und </data> soll eingelesen werden, der Rest nichht.

Danke,

Johannes
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Freitag 17. März 2006, 13:15

z.B. so (regexp sind u.U. besser, z.B. wenn die Matches Case-insentive sein müssen)

Code: Alles auswählen

in_data = False
buffer = []
for line in file("datei"):
  if "<data>" in line:
    in_data = True
    line = line[line.find("<data>")+6:]
  if in_data:
    buffer_append(line)
  if "</data>" in line:
    break
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 17. März 2006, 19:17

Wie wärs mit sowas:

Code: Alles auswählen

import re
content = '<data>abc</data>'
split_data = re.compile(r'<data>(.*)</data>')
print split_data.findall(content)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Montag 20. März 2006, 10:21

Hi!

Warum funktioniert das so nicht?

Code: Alles auswählen

import re 
content =  open('test.txt','r')
print content.read()

print '_________________'
split_data = re.compile(r'<data>(.*)</data>') 
print split_data.findall(content)
Inputfile sieht so aus:

Code: Alles auswählen

Das ist ein Datenblatt!

<data>
Das sind die relevanten Daten.
Das muss ausgegeben werden.

JAWOHL!!
</data>

Das ist nicht mehr so wichtig!!

ENDE
Danke!

Die Fehlermeldung ist:

Traceback (most recent call last):
File "//MARS/LAV02$/Gebert/SYSTEM/Desktop/file_open_gezielt.py", line 7, in -toplevel-
print split_data.findall(content).read()
TypeError: expected string or buffer

Danke für eure Hilfe.

Johannes
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Montag 20. März 2006, 10:25

Wenn Du mal genau guckst siehst Du dass der gepostete Code nicht mit dem Traceback übereinstimmt (wobei der gepostete Code auch nicht funktionieren sollte, lies noch mal was content.read() macht, und was content ist). Und im Traceback ist dann auch offensichtlich was der Fehler ist, wenn Du das andere Beispiel korrigiert hast.
--- Heiko.
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Montag 20. März 2006, 10:28

stimmt habe eine fehlermeldung zu weit oben genommen. sorry.
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Montag 20. März 2006, 10:31

Traceback (most recent call last):
File "//MARS/SYSTEM/Desktop/file_open_gezielt.py", line 7, in -toplevel-
print split_data.findall(content)
TypeError: expected string or buffer

So lautet der Fehler.

Wie muss ich den Code umstellen, dass die Fehlermeldung nicht mehr kommt?

LG

Johannes
Zuletzt geändert von keboo am Samstag 25. März 2006, 14:07, insgesamt 1-mal geändert.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 20. März 2006, 11:29

keboo hat geschrieben: print split_data.findall(content)
TypeError: expected string or buffer
content ist auch nicht der Inhald der Datei als String, sondern es ist dein Dateihandling!

Mach besser sowas:

Code: Alles auswählen

f = file(...)
content = f.read()
f.close()
...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

Montag 20. März 2006, 11:35

Code: Alles auswählen

import re

datei =  open('test.txt','r')
content = datei.read()
print content

print '_________________'
split_data = re.compile(r'<data>(.*)</data>')
print split_data.findall(content)
r2d2

Edit: sorry, jens war schneller
äh, nimm diese schlange von meinem hals.
Antworten