2017-03-12 2 views
1

Also, ich habe eine Textdatei, die wie folgt aussieht:Hinzufügen verschiedener Daten an verschiedene Wörterbücher aus einer Textdatei

AUD_CHF 0.77324 
AUD_EUR 0.72657 
AUD_GBP 0.61557 
AUD_JPY 86.88 
AUD_USD 0.76835 
CAD_EUR 0.722459831 
CAD_GBP 0.612726326 
CAD_CHF 0.76915 
CHF_EUR 0.939858457 
CHF_GBP 0.795924865 

Was ist durch ich tun möchte, lesen und setzen jede Währung in sein eigenes Wörterbuch zB. AUD {AUD_CHF: 0.77324, AUD_EUR :0.72657 AUD_GBP :0.61557 AUD_JPY :6.88, AUD_USD :0.76835} dann CHF, USD usw. Es wird 18 Wörterbücher geben, wenn Sie fertig sind. Ich habe es mit dem folgenden Code geschafft (mit etwas Hilfe bei einer anderen Frage), aber es ist lang und nicht sehr pythonisch, wie ich es verstehe. Es sieht so aus

Ich meine, es funktioniert, aber ich kann mir nicht vorstellen, dass es keinen besseren Weg gibt. Ich sprach mit einem Freund und er schlug eine Lösung vor, es benutzte vars(), local() und nach dem, was ich gelesen habe, ist das keine großartige Sache und ich konnte es nicht so funktionieren lassen, wie ich es wollte. Ich dachte an eine Art Loop, aber ich kann nichts erreichen. Wenn jemand Ideen für mich hat, wäre ich dankbar. Selbst wenn es nur ein Skelett ist, kann ich gehen und versuchen, es zum Laufen zu bringen.

Vielen Dank für Ihre Zeit, Entschuldigung, das ist ein bisschen lang.

Antwort

1

Wie über ein Wörterbuch der Wörterbücher und einige defaultdict:

from collections import defaultdict 
currencies = defaultdict(dict) 

with open('rates.txt', 'r') as f: 
    for line in f: 
     if line: 
      currency, rate = line.split() 
      currencies[currency[:3]][currency] = rate 

in Resultierende:

In [39]: currencies['AUD'] 
Out[39]: 
{'AUD_CHF': '0.77324', 
'AUD_EUR': '0.72657', 
'AUD_GBP': '0.61557', 
'AUD_JPY': '86.88', 
'AUD_USD': '0.76835'} 

In [40]: currencies['CHF'] 
Out[40]: {'CHF_EUR': '0.939858457', 'CHF_GBP': '0.795924865'} 

In [41]: currencies['CAD'] 
Out[41]: {'CAD_CHF': '0.76915', 'CAD_EUR': '0.722459831', 'CAD_GBP': '0.612726326'} 

bearbeiten.

Wenn Sie Linien haben, die mit Raumtrennung nicht erfüllen, können Sie einen Try/außer Block unter anderem versuchen:

from collections import defaultdict 
currencies = defaultdict(dict) 

with open('rates.txt', 'r') as f: 
    for line in f: 
     if line: 
      try: 
       currency, rate = line.split() 
      except ValueError: 
       # good practice to log here, if you were to have logging. 
       continue #skip to next line 
      currencies[currency[:3]][currency] = rate 
+0

hatte ich noch nie von defaultdic gehört. Ich habe etwas zu lesen, danke, so viel zu lernen. Ich habe es eingegeben und bekam 'ValueError: mehr als 0 Werte zum Entpacken' von Zeile 7. Basierend auf [link] (http://stackoverflow.com/questions/13891813/valueerror-need-more-than-0-values -entpacken-Python-Listen) und [link] (http://stackoverflow.com/questions/12687158/valueerror-need-more-than-0-values-to-unpack) (oder ist es etwas, was ich getan habe ?) Ich habe es geändert und es läuft durch. 'Währungen drucken' gibt keine Wörterbücher zurück. Ich bin mir nicht sicher, wie Sie Ihr "Ergebnis" erhalten haben. Nochmals vielen Dank, wirklich schätzen Sie Ihre Zeit. – Pale

+0

@pale siehe Bearbeiten, eine Ihrer Zeilen entspricht nicht dem 'first second' Leerzeichen, was erwartet wird. 'Währungen' haben nichts, wenn sie darauf stoßen. – salparadise

+0

Der Datensatz, den ich erstellt hatte, enthielt zwei Duplikate, die den Fehler verursachten. Ich habe diesen Fehler gegoogelt und zu keinem Zeitpunkt darauf hingewiesen, dass es aus schlechten Daten stammt ... so lernst du, denke ich. @salparadise Dein Code ist so prägnant .... Ich hatte überall Zeug. Danke nochmal, dass du mir geholfen hast. – Pale

Verwandte Themen