Label-Strings von einer Datei importieren

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
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo,

ich habe viele Labels, welche ich benennen muss. Dazu möchte ich eine Text- oder CSV-Datei verewenden um meine Labels zu benennen. ABer das Ergebnis ist noch nicht zu gut. Ich kann keine Sonderzeichen (ä,ö, ü) verwenden und ich habe noch {} in jedem Label.

Code: Alles auswählen

arr = []
with open('conf.csv', 'r') as conffile:
	csvreader = csv.reader(conffile)
	arr = list(csvreader)
und später wird so zugegriffen.

Code: Alles auswählen

	for c in range(0,AA):
		self.labels4.append(Label(self.t4.sub_frameC, text=arr[c], relief=SUNKEN))
Wisst ihr woran das liegt?


Grüße von Stefan
Zuletzt geändert von Anonymous am Freitag 14. April 2017, 12:38, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@stefanxfg: hast Du denn eine csv-Datei? Und was steht in den Spalten außer dem Labeltext? Die komischen Zeichen kommen daher, dass Du Listen statt Strings als text verwendest. »arr« ist ein schlechter Name für Informationen über Labels, die Initialisierung mit einer leeren Liste ist überflüssig. Wenn man anfängt, Attribute durchzunummerieren, will man eigentlich ein Datenstruktur verwenden, was soll die 4 denn bei labels4 bedeuten. t4 ist auch ein nichtssagender Name und sub_frameC hört sich auch so an, als ob Du nicht wüßtest, für was der Frame eigentlich da ist. In Python iteriert man nicht über einen Index, wenn man gleich die Listenelemente in der for-Schleife benutzen könnte. Eingerückt wird immer mit 4 Leerzeichen pro Ebene.

Code: Alles auswählen

with open('conf.csv', 'r') as conffile:
    csvreader = csv.reader(conffile)
    label_infos = list(csvreader)

for text, restliche, spalten in label_infos:
    self.labels4.append(Label(self.t4.sub_frameC, text=text, relief=SUNKEN))
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Danke erst einmal für deinen Beitrag. Ich nehme an, dass man von der CSV immer nur Text einlesen kann. Ich weiß nicht, wie ich das als String angeben soll.
Insgesamt ist es so dass ich erst einmal meine Labels mittels dieser Datei beschriften möchte. Später sollen auch Entry-Werte darin enthalten sein. Ebenfalls gewisse Programmeinstellinformationen sollen mit abgespeichert werden.
Ich möchte dieses Dateiformat zum Programmformat machen. Also Einlesen dieser Datei und auch Speichern von Input-Werten.

Das Snippet ist nicht aussagekräftig, das ist mir klar. Daher entschuldige bitte die möglicherweise nicht sinnfällige Benennung.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

stefanxfg hat geschrieben:Danke erst einmal für deinen Beitrag. Ich nehme an, dass man von der CSV immer nur Text einlesen kann. Ich weiß nicht, wie ich das als String angeben soll.
Insgesamt ist es so dass ich erst einmal meine Labels mittels dieser Datei beschriften möchte. Später sollen auch Entry-Werte darin enthalten sein. Ebenfalls gewisse Programmeinstellinformationen sollen mit abgespeichert werden.
Ich möchte dieses Dateiformat zum Programmformat machen. Also Einlesen dieser Datei und auch Speichern von Input-Werten.

Das Snippet ist nicht aussagekräftig, das ist mir klar. Daher entschuldige bitte die möglicherweise nicht sinnfällige Benennung.
Ich habe außerdem den Import über ein Textfile ausprobiert. Dabei fügt er mir in die Labels den Text von der Zeile und eine Leerzeile ein. Keine Ahnung warum das so ist.

Code: Alles auswählen

with open('Fahrzeug_conf.csv', 'r') as conffile:
	vehiclearr = conffile.readlines()
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@stefanxfg: Du bekommst Leerzeilen, weil jede Zeile einer Datei mit einem Zeileendezeichen beendet wird ('\n'). Wenn Du das nicht willst, solltest Du es entfernen (.strip()). Schau Dir doch mal an, was Du denn da machst und versuche zu verstehen, warum welche Typen und Werte in den Variablen stehen.

So wie Du die Information, die Du in einer Datei speichern willst, beschreibst, ist csv wahrscheinlich das falsche Dateiformat.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo nocheinmal.

Ich möchte das Thema des "richtigen" Datei-Formats noch einmal aufgreifen. Vielleicht kannst du mir Tipps aus deiner Erfahrung geben.
1. Zunächst habe ich, wie beschrieben, eine Art tabellaisches Blatt aus Label und Entry. Mehrere Tabellen mit unterschiedlich vielen Einträgen.
Die Erstellung dieser Tabelle läuft bei Programmstart. Ich möchte die Inhalte der Labels aus einer Datei beziehen, welche sich im Installationspfad befindet. Es könnte eben auch eine Txt-Datei sein. Die Labels sollen nur vom Entwickler veränderbar sein. Das heißt, sie sind für den User immer fest vorgegeben. Die Datei soll vom User nicht anwählbar sein.

2. Die oben benannten Entrys mehrerer Tabellen stellen die Datenbehandlung dar. Diese sollen in ein Datei-Format abgelegt werden und bei Neustart wieder importiert werden. Dabei denke ich auch daran, Programmeinstellinformationen zu hinterlegen. Ich meine zum Beispiel Checkbutton-Informationen. Also ob der Haken bereits gesetzt war oder nicht.
Die Datei soll vom User anwählbar sein, so dass er die Datei öffnen und auch speichern kann.

3. Ich gedenke in Zukunft auch Datenbanken mit einzubeziehen. Bei bestimmten Tabellen sollen es möglich sein, die Daten entweder aus der Eingabedatei oder aus der Datenbank zu entnehmen.

So wie ich es sehe, kann man das in fast jedem Format machen. Aber ich bin gespannt, wie es aus deiner Erfahrung aussieht. Am Ende des Programms mache ich Datenexporte. Ich denke auch an Excel.

Zu dem von mir anfänglich beschriebenen Problem habe ich wie folgt gelöst:

Code: Alles auswählen

with open('Label_conf.csv', 'r') as conffile:
	Labelnamen = conffile.read().splitlines()
BlackJack

@stefanxfg: Für strukturiertere Daten über einfache 2D-Tabellen hinaus bietet sich JSON oder YAML an. Für JSON gibt es ein Modul in der Python-Standardbibliothek.

Das der Benutzer nichts ändern kann wird schwierig insbesondere wenn er der Besitzer des Rechners ist. Ansonsten ist das etwas das man über die Zugriffsrechte des Betriebs- beziehungsweise Dateisystems regeln muss.

Eine CSV-Datei nicht mit dem `csv`-Modul, oder einem anderen Modul oder einer Funktion die auf CSV-Dateien ”spezialisiert” ist, zu verarbeiten, wirft die Frage auf ob es sich tatsächlich um eine CSV-Datei handelt. Du behandelst das jetzt als einfache Textdatei mit Zeilen und nicht als strukturierte 2D-Daten im CSV-Format.
Antworten