Seite 1 von 1

Datei øffnen und Zeile fuer Zeile in Liste einlesen

Verfasst: Samstag 23. Oktober 2004, 09:08
von Gunnar
Moin !
Ich habe mir gestern den Kopf ueber folgendes Problem zerbrochen :
Es gibt eine Datei ( æhnlich einer Logdatei ) in der folgende Infos stehen kønnten :

TITLE: EDL CONFORM_V01
001 1 V C sc01_sh01_v01 0007 0058 0001 0051
002 ....... usw.

Ich møchte nun nacheinander jeweils eine Zeile in eine Liste packen ( also alles was durch tab / leerzeichen getrennt ist auf einen eigenen Index )
um vernuenftig mit den einzelnen Daten arbeiten zu kønnen.

Das einzig sinnvolle, was mir die Doku hergab war mittels Schleife und split() immer 9 wørter ( die erste Zeile ignorieren wir mal ) einzeln in eine Liste zu legen. Das sollte ich hinbekommen, allerdings frag ich mich, ob es auch einfacher geht ?

Danke fuer kommende Ideen :0)

Mfg Gunnar

P.S.
Die Suche im Forum ergab auch nur eine Kombination von Schleifen und split(). Leider bin ich einfach zu neu, um mich mit allen vorhandenen Modulen, Methoden und Objekten auszukennen...sorry

Re: Datei øffnen und Zeile fuer Zeile in Liste einlesen

Verfasst: Samstag 23. Oktober 2004, 09:21
von NOTZE
Gunnar hat geschrieben:
Ich møchte nun nacheinander jeweils eine Zeile in eine Liste packen ( also alles was durch tab / leerzeichen getrennt ist auf einen eigenen Index )
um vernuenftig mit den einzelnen Daten arbeiten zu kønnen.
Also wenn alles durch leerzeichen getrennt werden solle biete sich readline des fileobjektes an.

Verfasst: Samstag 23. Oktober 2004, 10:35
von Dookie
Hi Gunnar,

Dateien können auch als Quasilistenartige Objekte (Iterable) behandelt werden, wobei die Elemente dann die einzelnen Zeilen sind. So können sie auch mit Listcomprehensions bearbeitet werden:

Code: Alles auswählen

f = file("dingens.txt", "r")
data = [z.rstrip().split() for z in f]
f.close()
Falls Du die erste Zeile nicht brauchst, machst du einfach

Code: Alles auswählen

data = [z.rstrip().split() for z in f][1:]

Gruß

Dookie

Verfasst: Samstag 23. Oktober 2004, 11:27
von Gunnar
Danke erstmal fuer die Antworten soweit. Ich probier es gleich einmal auf deine Art und Weise aus Dookie. Ich bin næmlich mit dem Abfragemodul endlich fertig *schwitz*

Ich gebe nochmal ein Feedback, wenn das Auslesen so funktioniert, wie ich will :0)


Bis spæter,
Gunnar
:D

Verfasst: Samstag 23. Oktober 2004, 11:29
von fs111
Kurz mal offtopic gefragt: Sind bei Euch die Umlaute in Gunnars Postings auch andere Zeichen, oder stimmt was mit meinem Browser nicht?

fs111

Verfasst: Samstag 23. Oktober 2004, 11:33
von Dookie
Hi fs111,

Gunnar scheint aus Schweden oder einem anderen skandinavischen Land ins Forum zu kommen. Daher die für uns seltsamen Sonderzeichen/Umlaute.


Dookie

Verfasst: Samstag 23. Oktober 2004, 14:07
von Gunnar
:lol:

Um genau zu sein : Norwegen

Ja, ich sitze hier tatsæchlich in Norwegen und schreibe ein Script fuer die deutsche Wirtschaft. Ist es nicht zuvorkommend ? :wink:

Um wieder auf den Topic zurueck zu kommen :

Der Scriptfetzen, den du mir gegeben hast Dookie, funktioniert perfekt. Das Script ist noch nicht fertig, aber ich hab' gesehen, dass er eine Liste in einer Liste erzeugt, was fuer meine Zwecke nahezu perfekt ist.

Kannst du mir einen Gefallen tun, damit bei mir auch ein bisschen mehr Lerneffekt ist ? Erklære mir folgendes :

Diese Iterable, wo finde ich in der Doku die genaue Beschriebung, wie ich so etwas erstelle ?

Und dann kann ich eigentlich dein gesamtes Script nachvollziehen, bis auf die genaue Funktion von rstrip() ( in der Doku steht : schneidet die Whitespaces usw. weg ) Bloss woher weiss dein Script, dass es Zeilenweise einlesen soll...kommt das von diesem ominøsen "z" ? Ich bin leider noch nicht so weit in diese Sprache vorgestossen, als das ich mir das erklæren kønnte.

Danke dir ( ich hoffe das war nicht zu verfrickeltes Deutsch, das hab' ich hier næmlich verlernt ;0) )

Mfg Gunnar

Verfasst: Samstag 23. Oktober 2004, 15:27
von Milan
Hi, ich bin zwar nicht Dookie, aber antworten kann ich ja trotzdem :wink: . Dookie bedieht sich hier der List Comprehensions, mit denen man die Funktionen map und filter ersetzen kann. Es wird eine Funktion auf alle Elemente eines Iterables (z.B. einer Liste oder eines Dictionarys) angewendet. Vereinfach kannst du das auch so schreiben:

Code: Alles auswählen

erg=[]
for z in f:
    erg.append(z.rstrip().split())
data=erg[1:]
Das man einfach for z in f schreiben kann, liegt daran, dass eine Datei auch ein Iteratorobjekt ist. Hä? Was ist das? Das ist grob gesagt ein Objekt, was man durch eine for-Schleife quetschen kann und in dem Fall werden immer die Zeilen zurückgegeben. Das ganze hab ich schonmal hier ausführlich erklärt *faulsei* :wink: . Nun hast du also in z eine einzelne Zeile und diese beinhaltet noch einen Zeilenumsprung ("\n"). Den trennt Dookie immer mit rstrip() ab, da dieser auch als Freiziechen gewertet wird, genau wie ein Leerzeichen. Ich benutze dafür immer replace("\n",""), aber das ist Geschmackssache. Zum Schluss willst du die einzelnen Wörter haben, deswegen wird noch einmal gesplittet und fertig sind wir.
Die ganzen Stringfunktionen findest auch in der Docu und hier steht alles zu Dateien, da findest du auch raus (wenn du weißt wie Iteratoren funktionieren), warum eine Datei sich so Zeilenweise lesen lässt.

So, jetzt hab ich dich ganz schön mit Material zugebombt... Meld dich einfach, wenn du weitere Fragen hast.

mfg Milan

Verfasst: Samstag 23. Oktober 2004, 16:49
von Gunnar
Das mit den Iteratorobjekten ist mir jetzt verstændlich, dann hab' ich jetzt nicht mehr nur Fragezeichen um den Kopf, nur weil ich fremden Code mit eingebaut habe :wink:

Takk skal du har !

Allerdings, und ich weiss nicht, ob ich nicht einen neuen Thread aufmachen muesste...

...stehe ich vor einem neuen Problem :

Nachdem ich die Zahlen soweit manipuliert und in Listen hin und her kopiert habe, wie ich es wollte, muss ich die Ausgabe ( die ein String sein muss !! ) in einen String umwandeln. Es gibt viele Funktionen wie long(), int(), float() usw. , die mir die strings in Zahlenwerte umwandeln. Gibt es auch eine Funktion, die Zahlen in einen String verwandelt ?
Es kann gut sein, dass ich es in der Doku nur uebersehen habe, aber dort war nichts zu finden...

Verfasst: Samstag 23. Oktober 2004, 16:59
von Milan
Hi. Ja: mit str :wink: . DAnn gibt es da auch noch repr, aber die wird für was anderes genutzt. Das kannst du dir ja mal verdeutlichen, indem du eine gleitkommazahl mit str und mit repr umwandelst. Str liefert den Wert, den man für Texte braucht und repr den, der das Objekt möglichst genau beschreibt, sodass man vom String aus wieder zum ursprünglichen Objekt zurück kommt.

Verfasst: Samstag 23. Oktober 2004, 18:02
von Dookie
Hi nochmal,

es gibt neben str noch die Möglichkeit Daten in Strings hineinzumischen, was für deine Anwendung vielleicht interessant ist:

Code: Alles auswählen

tpl = "Hier kommt ein Float %3.2f mit 3 Vorkomma- und zwei Nachkommastellen"
print tpl % 3.1415
tpl = "Hier mal 3 verschieden Werte %s %i %x"
print tpl % (repr("Hallo"), 3, 125)
print '%(language)s has %(#)03d quote types.' % {'language': "Python", "#": 2}
Statt eines Tuples kann auch eine Liste oder ein anderes Iterable-Objekt verwendet werden.
Weitere Informationen dazu findest Du auf:
http://www.python.org/doc/current/lib/t ... rings.html

Man kann sich solche Formatstrings auch mit Informationen zu z.B. Listen zusammenbauen.

Code: Alles auswählen

a = [1,3,2,5,4,7,6]
tpl = "Daten: " + (", ".join(["%i"]*len(a)))
print tpl % a
#oder mit Listcomprehension
print "Daten: " + ", ".join([str(x) for x in a])
Wobei die Version mit dem % wenn der Formatstring für mehrere Listen (Iterable) verwendet werden soll vorzuziehen ist.


Gruß

Dookie

Verfasst: Samstag 23. Oktober 2004, 18:50
von Gunnar
Ah ok... :idea:

Fuer meine Anwendung ist es schon in Ordnung, das alles immer komplett in Interger umzuwandeln und zurueck. Allerdings kann ich mir schon vorstellen, dass man damit bei einigen Anwendungen schnell an eine Wand fæhrt... ( hups..nun bekomme ich nie wieder meine Gleitkommazahl hin ;0) )

Danke, fuer die schnellen und netten Antworten...jetzt such ich mir noch die copy und rename funktionen raus und dann muesste ich das Script schon morgen fertig haben.

:D

Hilse fra Gunnar i Norge !!

Verfasst: Samstag 23. Oktober 2004, 18:55
von Milan
Gunnar hat geschrieben:Takk skal du har !
Gunnar hat geschrieben:Hilse fra Gunnar i Norge !!
Nochmal Offtopic: Nur mal so aus Interesse, was heißt das eigentlich? Es heißt ja, nordische Sprachen haben große Ähnlichkeit mit unserem deutsch, aber was darauf reimen kann ich mir nicht... :oops: :roll:

Verfasst: Samstag 23. Oktober 2004, 19:38
von Dookie
Also ich seh da eher eine Ähnlichkeit zu Klingonisch ;)


Dookie

Verfasst: Samstag 23. Oktober 2004, 20:15
von Gunnar
Wenn man es einfach Deutsch ausspricht...und dann am besten auch noch aus dem Norden Deutschlands kommt ( Plattdeutsch ) Versteht man einiges davon auf Anhieb.

Takk skal du har = ( direkt ) Dank sollst du haben
Bei uns eher = Dankeschøn

Alternativ = tusen takk ( tausend Dank )


Hilse fra Gunnar i Norge = ( direkt ) Gruesse von Gunnar in Norwegen
Bei uns eher = Gruss aus Norwegen, Gunnar

Habt ihr nicht einfach mal das hier versucht ? :

Code: Alles auswählen

from norway import language
hirn.append(language(in_zarten_stuecken))
:wink:

Verfasst: Samstag 23. Oktober 2004, 20:57
von Milan
Hi. Gibt bei mir nen ImportError... aber dafür funktioniert das hier:

Code: Alles auswählen

import sys
from language import norway
sys.stdout.write(norway.translate(fach_chinesisch))
Und du hast mir gerade das Modul geliefert :wink:
thx, Milan