2016-03-21 14 views
0

Hallo Ich benutze Python 3 auf dem Mac und ich versuche, ein generisches Programm zu erstellen, um mit einer Reihe von verschiedenen Multimetern abhängig davon zu kommunizieren, welche Textdatei geladen wird. Zum Beispiel möchte ich ein Wörterbuch, das so etwas wie folgt aussehen:Wie kann ich den Inhalt von Textdateien im Wörterbuch ablegen

prog_key = {"DC_Volts":"FUNC:DC V","AC_Volts":"FUNC:AC V"...} #just an example 

Dies wird schließlich in Verbindung mit der pyvisa Bibliothek, um Befehle verwendet werden, um einen Meter zu senden.

Also, um mein Programm generic zu machen, möchte ich dieses Wörterbuch:

prog_key = {} 

eine Textdatei zu laden, die den folgenden Inhalt hat:

"DC_Volt”:”FUNC:VOLT DC”, 
"DC_Curr”:”FUNC:CURR DC”, 
"AC_Volt”:”FUNC:VOLT AC”, 
"AC_Curr”:”FUNC:CURR AC”, 
"Res_2”:”FUNC:RES”, 
"Res_4”:”FUNC:RES 4”, 
"Freq”:”FUNC:FREQ”, 
"Cap”:”FUNC:CAP”, 
"Temp”:”FUNC:TEMP”, 
"Diode”:”FUNC:DIO”, 
“Meas”:”MEAS:IMM” 

Wie ich habe es bereit In der Textdatei formatiert, möchte ich sie buchstäblich im Wörterbuch ablegen (alle Anführungszeichen, Doppelpunkte und Kommata sind vorhanden). Ich mache es so, weil verschiedene Meter unterschiedliche Befehle haben, also kann ich einfach eine andere Textdatei laden, wenn ich einen anderen Meter benutze.

Ist die Tatsache, dass meine Befehle Doppelpunkte haben, irgendwelche Probleme verursachen?

Wenn es einen besseren Weg gibt, habe ich nichts dagegen, meine Textdatei neu zu formatieren. Die Hauptsache ist, dass ich alle meine Textdateien dem gleichen Trend folge, ist es nicht wirklich wichtig, was dieser Trent ist, solange es funktioniert!

Dank

Edit: die sind in der Tat gerade sein soll zitiert

+1

Sind diese tatsächlich typografische Anführungszeichen ('„'und'“') drin, oder sind sie wirklich gerade Anführungszeichen ('" ')? – ShadowRanger

+0

Das klingt eher wie ein Anwendungsfall für Klassen als für Wörterbuch. Im Grunde genommen Eine Klasse ist ein aufgepepptes Wörterbuch, man kann sogar Vererbung verwenden, um mit Zählern zu arbeiten, die einige Gemeinsamkeiten haben –

+0

Ich habe sie bearbeitet, sie sollen gerade Zitate sein –

Antwort

1

Ich denke, vielleicht einen besseren Weg, um die Datei zu formatieren CSV ist (mit Komma Linie Trennzeichen und Doppelpunkt Feldbegrenzungszeichen zu vermeiden, die sich). Zum Beispiel

"DC_Volt","FUNC:VOLT DC" 
"DC_Curr","FUNC:CURR DC" 
"AC_Volt","FUNC:VOLT AC" 

Dies würde ermöglichen es Ihnen, in Ihrem Wörterbuch zu lesen wie folgt:

import csv 

my_dict = {} 

with open('myfile.csv', 'r') as f: 
    for line in csv.reader(f): 
    my_dict[line[0]] = line[1] 

EDIT: Wie @ShadowRanger vorgeschlagen, könnte dies für JSON als CSV besser sein. (Dadurch können Sie Ihr Schlüsselwertformat beibehalten).

Die Datei könnte wie folgt aussehen:

{ 
    "DC_Volt":"FUNC:VOLT DC", 
    "DC_Curr":"FUNC:CURR DC", 
    "AC_Volt":"FUNC:VOLT AC" 
} 

und Sie könnten Code sein:

import json 

with open('myfile.json', 'r') as f: 
    j = json.load(f) 
+0

Eigentlich wäre es sogar einfacher, wenn es genau ein Paar ist pro Zeile: 'my_dict = dict (csv.reader (f))' würde es tun.Keine Notwendigkeit zu initialisieren, um 'dict', keine explizite Schleife in Python zu initialisieren. – ShadowRanger

+0

Ah, netter kleiner Einzeiler! Wird es notieren das. – user3194712

+0

Sobald ich das gepostet habe, dachte ich über die Verwendung eines csv statt –

1

Nun, ohne Ihre vorhandene Datei zu ändern, da Ihre Schlüssel und Werte sind alle gesetzlichen str Literale (unter der Annahme, Diese schlauen Zitate waren ein Fehler), Sie könnten Python einfach die Arbeit mit ast.literal_eval oder json.loads:

import ast 
import json 

with open(myfilename) as f: 
    dict_literal_str = '{{ {} }}'.format(f.read()) 
# With ast 
prog_key = ast.literal_eval(dict_literal_str) 
# or json 
prog_key = json.loads(dict_literal_str) 
machen lassen
+0

Warum die doppelten geschweiften Klammern? –

+0

@PeterWood: Die 'format' Methode interpretiert sie sonst als Formattrennzeichen; Sie entkommen Klammern, indem Sie sie verdoppeln. – ShadowRanger

+0

Ah, ich erinnere mich jetzt, danke. –

-1

Dies setzt voraus, dass alle Anführungszeichen in der Datei eine tatsächliche " sind und nicht diese anderen Art von Anführungszeichen. Was das bedeutet, lesen Sie die Datei, passen Sie einen Regex-Ausdruck dagegen an und füllen Sie das Wörterbuch.

import re 

dictionary = {} 
file = open(FILE_NAME, "r") 
for line in file: 
    catched = re.findall("\"(.*)\":\"(.*)\"", line) 
    # Only one result which is a tuple 
    dictionary[catched[0][0]] = catched[0][1] 
file.close() 
+0

Erneutes Implementieren des grundlegenden Parsens mit Regexen? Bitte nicht. (Verwende auch 'with' Anweisungen für Dateiobjekte) – ShadowRanger

+0

@ShadowRanger Ich bin einer jener Leute, die das Rad neu erfinden wollen, anstatt das aktuelle Design des Rades zu benutzen. Außerdem denke ich, dass dies dem Wissen der Menschen etwas hinzufügen könnte. Ihr Code ist klein und einfach, aber mir ist nicht klar, was er tatsächlich tut. Schließlich bin ich ein Anfänger: P – engineercoding

+0

Ich bin ganz für _learning_, indem ich Räder neu erfinde, aber das Erreichen von regulären Ausdrücken verbessert hier die Dinge nicht wirklich. Insbesondere wenn es um das Parsen bekannter Formate geht, sollte immer ein geeigneter Parser verwendet werden, wenn dieser verfügbar ist. Die Randfälle für das Parsing sind hässlich und oft unmöglich oder schrecklich hässlich, um mit regulären Ausdrücken (die entweder keine kontextfreie Grammatik oder expressive kontextfreie Grammatiken sind) richtig umzugehen. Wenn möglich, verwenden Sie immer zuerst einen vorhandenen Parser und greifen Sie nur auf reguläre Ausdrücke zurück, wenn keine vorhanden sind, und das Format ist einfach genug, um größere Randfälle zu vermeiden. – ShadowRanger