Dateien einlesen lassen / Listen in Python

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
Astyzz
User
Beiträge: 4
Registriert: Donnerstag 14. Januar 2016, 13:49

Hallo Zusammen,
ich bin neu hier und hoffe, ihr könnt mir helfen :)
Mein Problem: Ich möchte gerne eine Funktion schreiben, die die Datei „sentlexion“ öffnet und einliest. Außerdem möchte ich aus jeder Zeile die 3. Spalte in eine Liste speichern und diese Liste dann zurück geben.

Soweit bin ich bisher gekommen:

Code: Alles auswählen

def read_lexicon(fname):

      lex_list = []
      Lexicon = open(fname)
      while True:
		line = lexicon.readline()
		print line.strip()
		if len(line) == 0:
			break

      return lex_list



def main():

lex_filename=("Hier steht der Pfadausdruck zur Datei")
lex_list = read_lexicon(lex_filename)
print lex_list

main()
Wenn ich nun jetzt diese Funktion ausführe, spuckt Python mir schon mal alles aus, was in diesem Lexikon steht (sehr viele Zeile), mit folgendem Aufbau:

type=strongsubj len=1 word1=avidly pos1=anypos stemmed1=n priorpolarity=positive

Ich möchte nun aus jeder Zeile von dieser Datei, die 3. Spalte (also "word1=avidly") auslesen und in eine andere Liste (lex_list) packen und dort auch ausgeben lassen.



Mein Problem ist also nun:

Wie kriege ich das genau hin, dass Python durch das Lexikon geht, die 3 Spalte jeder Zeile rausnimmt und diese dann in eine andere Liste speichert? :roll: :?:
Zuletzt geändert von Anonymous am Donnerstag 14. Januar 2016, 14:56, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Astyzz: Bitte ein Grundlagentutorial durcharbeiten und sich mit den Methoden auf Zeichenketten beschäftigen. In der Python-Dokumentation befindet sich beispielsweise ein Tutorial.

Namen nicht unnötig abkürzen (`filename` statt `fname`), keine konkreten Grundatentypen in den Namen schreiben (`lex_list`), bei der Namensschreibweise auf den Style Guide for Python Code achten.

Dateien die man öffnet sollte man auch wieder schliessen. Die ``with``-Anweisung ist da sehr hilfreich.

Die ``while``-Schleife ist viel zu umständlich, man kann über Dateiobjekte mit ``for`` iterieren und bekommt da die einzelnen Zeilen.

Ist das Absicht das bei der ersten Zeile abgebrochen wird die nur Leerraum enthält, auch wenn danach noch weitere Zeilen kommen würden?
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Astyzz: suchst Du str.split?

In Python sähe die Funktion so aus:

Code: Alles auswählen

def read_lexicon(filename):
    lexicon = []
    with open(filename) as lines:
        for line in lines:
            print line
    return lexicon
@BlackJack: es wird mit der ungestrippten Zeile verglichen, die Schleife läuft also bis zum Schluß.
Astyzz
User
Beiträge: 4
Registriert: Donnerstag 14. Januar 2016, 13:49

Hallo,

erstmal vielen Dank für Eure Antworten! :)

Mein Programm laeuft ja bisher bis zum Schluß und spuckt bis dorthin jedesmal eine Zeile aus. Ich möchte nun aus jeder Zeile, auf die 3. Spalte zugreifen und die dort stehenden Wörter rausnehmen und anschließend in eine neue Liste reinpacken, sodass ich am Ende nur eine Liste bekomme, wo nur die word1=wörter aufgelistet werden und nicht der rest.

Beispiel:

type=strongsubj len=1 word1=batty pos1=adj stemmed1=n priorpolarity=negative

type=weaksubj len=1 word1=beacon pos1=noun stemmed1=n priorpolarity=positive

type=weaksubj len=1 word1=bearish pos1=adj stemmed1=n priorpolarity=negative

type=strongsubj len=1 word1=beast pos1=adj stemmed1=n priorpolarity=negative

type=strongsubj len=1 word1=beast pos1=noun stemmed1=n priorpolarity=negative

type=strongsubj len=1 word1=beastly pos1=adj stemmed1=n priorpolarity=negative


Und ich würde jetzt gerne eine Liste haben, wo nur ["word1=batty", "word1=beacon", "word1=bearish", "word1=beast", etc... , etc..] steht
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Den Hinweis auf split hast du ja schon bekommen. Hier noch mal ein Beispiel:

Code: Alles auswählen

>>> line = 'type=strongsubj len=1 word1=batty pos1=adj stemmed1=n priorpolarity=negative'
>>> print(line.split())
['type=strongsubj', 'len=1', 'word1=batty', 'pos1=adj', 'stemmed1=n', 'priorpolarity=negative']
Das Ergebnis ist eine Liste in der du nur noch auf das passende Element zugreifen brauchst.
Astyzz
User
Beiträge: 4
Registriert: Donnerstag 14. Januar 2016, 13:49

Ah, jetzt habe ich den Hinweis verstanden.

Mithilfe von split() werden die einzelnen Zeilen in eine jeweilige einzelne Liste gesetzt. Nun müsste ich also doch nur noch auf das richtige Element der Liste zugreifen und diese dann in eine neue leere Liste hinzufügen (mit append), in der Schleife?
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei solchen Daten könnte es auch sinnvoll sein, die Zeilen in ein Wörterbuch umzuwandeln:

Code: Alles auswählen

>>> line = "type=strongsubj len=1 word1=batty pos1=adj stemmed1=n priorpolarity=negative\n"
>>> dict(zip(*[iter(re.split('\s*(\S+?)=', line.strip())[1:])]*2))
{'stemmed1': 'n', 'len': '1', 'word1': 'batty', 'priorpolarity': 'negative', 'type': 'strongsubj', 'pos1': 'adj'}
Astyzz
User
Beiträge: 4
Registriert: Donnerstag 14. Januar 2016, 13:49

So, ich habe es hinbekommen. :) , Danke für den Hinweis :)
Antworten