Seite 1 von 4
Dicts. File.
Verfasst: Sonntag 11. April 2010, 18:09
von shuang
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?

Verfasst: Sonntag 11. April 2010, 18:19
von gkuhl
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
Verfasst: Sonntag 11. April 2010, 18:23
von derdon
Das csv-Modul und da speziell diese Klasse bieten sich an:
http://docs.python.org/library/csv.html#csv.DictReader
Verfasst: Sonntag 11. April 2010, 18:30
von shuang
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?
Verfasst: Sonntag 11. April 2010, 18:33
von gkuhl
shuang hat geschrieben:hmm?
Python soll das nicht sein, oder? Nochmal: Lerne die Grundlagen!
Verfasst: Sonntag 11. April 2010, 19:17
von Sr4l
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?

wow
Verfasst: Sonntag 11. April 2010, 19:31
von shuang
Sr4L superdankeeeeeeeeeeeeeeeeeeeeeeeee
1000mal danke

Verfasst: Sonntag 11. April 2010, 19:32
von 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.
Verfasst: Sonntag 11. April 2010, 19:43
von shuang
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?
Verfasst: Sonntag 11. April 2010, 19:46
von Sr4l
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.
Verfasst: Sonntag 11. April 2010, 19:59
von 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)``
Verfasst: Sonntag 11. April 2010, 20:10
von shuang
@ 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????
Verfasst: Sonntag 11. April 2010, 20:17
von gkuhl
@shuang: Was hast du denn bisher versucht? Und was hat dabei nicht funktioniert?
Verfasst: Sonntag 11. April 2010, 20:26
von shuang
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')
Verfasst: Sonntag 11. April 2010, 20:27
von shuang
und @ Blackjack, deine Lösung ist echt Klasse da oben für Dicts.

Verfasst: Sonntag 11. April 2010, 21:19
von gkuhl
Ich kenne mich mit regulären Ausdrücken nicht aus. Aber mit Dictionaries sollte es auch gehen:
Verfasst: Sonntag 11. April 2010, 21:32
von Sr4l
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.
Verfasst: Sonntag 11. April 2010, 21:56
von shuang
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
Verfasst: Sonntag 11. April 2010, 23:36
von 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?
Verfasst: Montag 12. April 2010, 23:42
von shuang
Nein genauso wie oben beschrieben
