Dicts. File.

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.
Benutzeravatar
shuang
User
Beiträge: 45
Registriert: Montag 5. April 2010, 14:30

Hi Leute,

ich habe ein File. bla.txt

in diesem File sind Namen mit Werten gespeichert. z.b:

Hans 1
Peter 2
Rolf 3
Jens 4

wie übernehme ich diese Daten in ein Dictionary?

Code: Alles auswählen


file = open()
b = file.readlines()
dic = {}
c = str(birsey).split()

Code: Alles auswählen

#oder so`???

file = file.split()
a =[file[i:i+ n] for i in range(file)-n+1)]
print a
ich bekomme das nicht hin. Könnt ihr mir bitte helfen? :roll:
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Grundlagen lernen:
- Benutze das with-Statement.
- Iteriere mit einer for-Schleife über die Zeilen der Datei.
- Benutze split() um die Zeilen zu bearbeiten.
- Erstelle damit das Dictionary.

Grüße
Gerrit
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Das csv-Modul und da speziell diese Klasse bieten sich an: http://docs.python.org/library/csv.html#csv.DictReader
Benutzeravatar
shuang
User
Beiträge: 45
Registriert: Montag 5. April 2010, 14:30

Code: Alles auswählen

file=  with open("C://Users/Crypton/Desktop/yeni.txt", "r").read()

file = file.split()
a =[file[i:i+ n] for i in range(file)-n+1)]
print a
hmm?
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

shuang hat geschrieben:hmm?
Python soll das nicht sein, oder? Nochmal: Lerne die Grundlagen!
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Du solltest file nicht unbedingt überschreiben.
Zudem möchte ich dir das Python Tutorial ans Herz legen bzw hier die deutsche Übersetzung http://tutorial.pocoo.org/

Code: Alles auswählen

>>> dic = {}
>>> with open("bla.txt") as f:
	for line in f.readlines():
		a, b = line.split()
		dic[a] = b

		
>>> print dic
{'Hans': '1', 'Jens': '4', 'Peter': '2', 'Rolf': '3'}
>>> 
PS: wie bist du auf den Code gekommen den du oben gepostet hast? ;-)
Benutzeravatar
shuang
User
Beiträge: 45
Registriert: Montag 5. April 2010, 14:30

Sr4L superdankeeeeeeeeeeeeeeeeeeeeeeeee :)

1000mal danke :)
BlackJack

@Sr4l: Warum ist eigentlich dieses `readlines()` nicht totzukriegen… Man kann über die Zeilen in einem Dateiobjekt direlt iterieren ohne erst alle in eine Liste einlesen zu müssen.
Benutzeravatar
shuang
User
Beiträge: 45
Registriert: Montag 5. April 2010, 14:30

was wäre eigentlich, wenn ich in meiner Liste sowas hätte

Name: Hans 19
Peter 20

Ausgabe: {Hans:19, Peter:20}

und ich brauche Name nicht in meinem Dictionary?
Muss ich dann mit regulären Ausdrücken umbedingt arbeiten?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Für 4 Zeilen soll's egal sein und auf viel mehr kommt shuang nicht wenn er sich nicht mit den basics von python beschäftigt und nur auf copy&p von code verlässt.

Um ehrlich zu sein habe ich auch kurz an .readline() gedacht aber ich schreibe lieber for schleifen ;-)

@Shuang
nicht unbedingt, aber du könntest ja z.B "Name: " durch "" ersetzen oder .split(":")[1].strip() es gibt tausende Möglichkeiten.
BlackJack

@Sr4l: Jetzt bin ich verwirrt. Was meinst Du damit das Du lieber ``for``-Schleifen schreibst!? Das ändert sich doch erst einmal gar nicht wenn man das an dieser Stelle sinnlose `readlines()` einfach weglässt. Also ``for line in f:`` statt ``for line in f.readlines():``.

Davon abgesehen geht es natürlich deutlich kürzer so: ``dic = dict(s.split() for s in f)``
Benutzeravatar
shuang
User
Beiträge: 45
Registriert: Montag 5. April 2010, 14:30

@ Sr4l, versteh ich nicht ganz.
Ich stelle mir gerade folgendes vor.

Sagen wir mal ich habe eine Textdatei mit folgendem Inhalt:


Name: Peter 19
Hans 39
Sarah 10
Lars 18

und ich habe noch eine weitere Textdatei:
Personen:
Peter 4
Hans 3
Sarah 2
Lars 3


Nun möchte ich das die Werte aus der 2ten Textdatei im ersteren subrahiert werden. Wie würde sowas funktionieren????
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@shuang: Was hast du denn bisher versucht? Und was hat dabei nicht funktioniert?
Benutzeravatar
shuang
User
Beiträge: 45
Registriert: Montag 5. April 2010, 14:30

Also was ich seit Tagen versucht habe ist mit Regulären Ausdrücken genau die Namen zu sortieren, aber hat nicht geklappt.
Ich konnte sie einfach nicht auslesen, geschweige den subtrahieren :)Ich habe so einiges ausprobiert. >>> Siehe unten.

Code: Alles auswählen

from re import *
import re

def coctails():
    datei = open("C:/Users/...............txt", "r").read()
    dat = file('C:/Users.....................txt', 'w')
    
    p = re.findall('(\w{5}:\s\w{7})', datei)
    d = re.findall('(\w{4}:\s\w{3})', datei)
    a = re.findall('(\w{5}:\s*\s\w)', datei)
    r = re.findall(('\d+'), datei)
    k = re.findall('(^Name $)', datei)
        
    '''if p.findall(datei):
        datei = datei.strip()#.replace("Person", "xxxxx")
        dat.write(datei)'''
            
    print p
    print d
    print r
    print a
    print k         
'''
        #while datei 
# p = compile('[\d:]\s')

Benutzeravatar
shuang
User
Beiträge: 45
Registriert: Montag 5. April 2010, 14:30

und @ Blackjack, deine Lösung ist echt Klasse da oben für Dicts. :wink:
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Ich kenne mich mit regulären Ausdrücken nicht aus. Aber mit Dictionaries sollte es auch gehen:

Code: Alles auswählen

diff[key] = dic1[key] - dic2[key]
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

BlackJack hat geschrieben:@Sr4l: Jetzt bin ich verwirrt. Was meinst Du damit das Du lieber ``for``-Schleifen schreibst!? Das ändert sich doch erst einmal gar nicht wenn man das an dieser Stelle sinnlose `readlines()` einfach weglässt. Also ``for line in f:`` statt ``for line in f.readlines():``.
Wusste nicht das das geht dachte, das könnte man nur über ne while Schleife lösen. Danke.
shuang hat geschrieben:Sagen wir mal ich habe eine Textdatei mit folgendem Inhalt:


Name: Peter 19
Hans 39
Sarah 10
Lars 18

und ich habe noch eine weitere Textdatei:
Personen:
Peter 4
Hans 3
Sarah 2
Lars 3


Nun möchte ich das die Werte aus der 2ten Textdatei im ersteren subrahiert werden.
Sinn und Zweck? Was soll passieren wenn ein Name in Name aber in Personen vorkommt? Ist "Personen:" bzw. "Name:" immer die erste Zeile der Datei?

Ich dachte dein Beispiel damals mit dem Problem: "Name: Peter 19" das in einer Zeile zufällig vor dem Name noch ein "Name: " steht.
Benutzeravatar
shuang
User
Beiträge: 45
Registriert: Montag 5. April 2010, 14:30

Genau ich habe 2Dateien mit den zuvor gezeigten Inhalten.
Ich möchte wenn z.b Peter im ersten und Peter im zweiten vorkommt den Wert aus der zweiten Datei abziehen. und die erste Datei dann mit den neuen Werten aktualisieren.
Beispiel

Text 1:
-----------------
Name: Peter
Figur: Bettler 4
Name: Guenther
Figur: Truil 10

Text2:
-------------------

Bettler 2
Truil 3

------------------

Ergebnis
Name: Peter
Figur: Bettler 2

Name: Guenther
Figur: Truil 7
BlackJack

@shuang: Du sagst Du hast Dateien mit den zuvor gezeigten Inhalten aber Dein aktuelles Beispiel sieht jetzt schon wieder etwas anders aus!? Ein wichtiger Teil beim Programmieren ist es sich über das Problem möglichst im klaren zu sein. Ist *das* jetzt die ganze Wahrheit oder sehen die Datenformate am Ende doch wieder anders aus?
Benutzeravatar
shuang
User
Beiträge: 45
Registriert: Montag 5. April 2010, 14:30

Nein genauso wie oben beschrieben :)
Antworten