Datei øffnen und Zeile fuer Zeile in Liste einlesen

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
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

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
NOTZE
User
Beiträge: 106
Registriert: Mittwoch 21. Januar 2004, 20:28

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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

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
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Kurz mal offtopic gefragt: Sind bei Euch die Umlaute in Gunnars Postings auch andere Zeichen, oder stimmt was mit meinem Browser nicht?

fs111
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi fs111,

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


Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

: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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Zuletzt geändert von Milan am Samstag 23. Oktober 2004, 18:33, insgesamt 1-mal geändert.
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

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...
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

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 !!
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Also ich seh da eher eine Ähnlichkeit zu Klingonisch ;)


Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

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:
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Antworten