String in Tuple umwandeln

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.
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,
wie kann ich folgenden String in eine Tuple umwandeln?

Code: Alles auswählen

String = "('NimbusSansL', 14, 'bold')"
font, size, b = String.replace('""', '').replace('(', '').replace(')', '').replace('\'', '').split(',')
Tuple = font.strip(), int(size), b.strip()
Umständlich, funktioniert aber.

Hoffe, Ihr könnt da mir was einfacheres zeigen.

Grüße Nobuddy
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum liegt der so ueberhaupt vor? Das klingt danach, als ob da statt eines vernuenftigen Formats wie JSON einfach die String-Repraesentation von Python-Tupeln genommen wurde. Wieso?

Mit dem ast-Modul kann man sowas dann einlesen, aber eigentlich gehoert der Fehler an der Quelle ausgemerzt.
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo, bin ein etwas älteres Semester und verwende CSV-Dateinen mit Tab-getrennten Listen.
Deine Vermutung, wird daher bestimmt richtig sein.
JSON und das ast-Modul, werde ich mir anschauen!

Danke, für die Info. :wink:
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

CSV-Dateien liest man mit dem csv Modul ein.
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Habe mich falsch ausgedrückt.
Sind keine CSV-Dateien, sondern Textdateien im CSV-Format (Tab-getrennt).
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Zum Lesen von Textdateien im CSV-Format gibt es das csv-Modul.
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

Nobuddy hat geschrieben: Dienstag 26. Juli 2022, 18:36 Sind keine CSV-Dateien, sondern Textdateien im CSV-Format (Tab-getrennt).
Was ist der Unterschied?
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Mit CSV, habt Ihr Recht und ich benutze auch das csv-Modul zum laden solcher Dateien. Da war ich gestern, leicht neben der Spur. :wink:

Ich habe mir JSON angeschaut, hat Ähnlichkeit mit namedtuple von dem Modul collections. Da werde ich mich noch mehr einlesen.

Das ast-Modul, habe ich mir auch angeschaut, bin mir da nicht sicher, wie ich das für mich verwenden kann.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

JSON ist ein eigenes Format für Datenstrukturen. Das brauchst du also nicht, um CSV-Dateien zu lesen.
Das hat auch nichts mit Namedtuple zu tun. Das eine ist ein Format, das andere eime interne Datenstruktur.

Wenn du JSON einlesen würdest, würden daraus Python Datenstrukturen gebildet werden.

Der Vorschlag mit JSON oder dem ast-Modul fußt auf der Annahme, dass du hier Daten lesen willst, die der String-Repräsentation in Python entspringen.

Vielleicht wäre es gut, wenn du dein konkretes Problem beschreiben würdest, statt das, was du für die Lösung hälst.

Also wie genau sehen deine Daten aus (mit Beispiel, nicht erklärt) und was willst du tun?
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo sparrow,
mit dem Lesen und Schreiben von Daten, hatte ich bisher keine Probleme.
Ich programmiere aus Interesse und Spaß an der Freude, komme aber nicht aus diesem Bereich.

Ich habe mir ein Projekt vorgenommen, wo ich Widgets ein eigenes einheitliches Layout festlegen kann (Farb- und Font-Layout). Das mal ganz einfach, ohne jetzt ins Detail zu gehen.
Ich verwende momentan tkinter und Dateninfo für Font ist "(Schriftart, Schriftgröße)".

Die Textdatei für Font, sieht so aus:

Code: Alles auswählen

1600	900	('NimbusSansL', 11)	('NimbusSansL', 13)	('NimbusSansL', 13, 'bold')	('NimbusSansL', 14)	('NimbusSansL', 14, 'bold')
1680	1050	('NimbusSansL', 12)	('NimbusSansL', 14)	('NimbusSansL', 14, 'bold')	('NimbusSansL', 16)	('NimbusSansL', 16, 'bold')
Die Datensätze sind auf die Bildschirmgröße bezogen.
Ändere ich jetzt über tkinter den Font eines Datensatzes und schreibe diesen wieder in die Datei zurück, stehe ich vor dem Problem, welches ich als erstes beschrieben habe.
Weiter lässt sich die Datei auch dann nicht mehr einlesen.
Vielleicht ist das Problem, dass ich String und Tuple im Datensatz verwende!?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, das ist ein eher unglueckliches Format, weil es einmal CSV mit einem nochmal unterstrukturierten Format kombinierst. Das bessere Vorgehen hier waere gleich ein Format zu waehlen, dass strukturiert ist, wie eben zB JSON. Aber NUR JSON, nicht eine Chimaere aus CSV + JSON. Also dann sowas etwa

Code: Alles auswählen

{
     "widgets": [
        { "position": [1600, 900],  "fonts": [ { "name": "NimbusSansL", "size": 11}, { "name": "NimbusSansL", "size": 13, "weight": "bold"}]}
    ]
}
Wenn das nicht genehm ist, sondern bleiben soll wie gehabt, dann wirst du das AST-Modul bemuehen muessen.
Benutzeravatar
snafu
User
Beiträge: 6873
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Warum braucht man dafür denn das AST-Modul und kann die Daten nicht wie ein normales Python-Modul mittels Import behandeln? Etwas wie config.py zu haben, ist ja nun wirklich nicht so ungewöhnlich...
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo __deets__,
mit so einer Struktur habe ich heute schon getestet, statt Deinem Key "widgets" habe ich die Zeilennummer des Datensatzes verwendet. Mit der Möglichkeit für die verschiedenen Widget-Klassen, ist das eine interessante Idee!
Muss nur noch lernen, wie JSON richtig umgesetzt wird. Könnte mir vorstellen, dass es ähnlich wie ein Python-Dictionary gehandhabt wird.

Mit dem ast-Modul, habe ich auch schon ein paar Codes durchlaufen lassen. Allerdings fehlt mir noch das Verständnis dafür. Wenn Du dafür evtl. einen ähnlich kurzen Beispiel-Code wie bei JSON?

Grüße Nobuddy
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@snafu: wie importierst du denn ein CSV modul, in dem fragmente von Python-artigem Ausdrücken eingebettet sind? Denn in dem Kontext steht der Tipp ja.
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

@snafu: entweder ist das wirklich nur eine Beschreibung von Widgets, dann ist das Programmcode und kann als .py-Datei geschreiben werden, dann gibt es aber kein Programm, das solche Dateien schreibt.
Oder es soll von einem Programm geschrieben und gelesen werden können, dann muß es in einem Format sein, das auch einfach zu lesen ist, und da würde ich irgendwas mit dem ast-Modul generell ausschließen.
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Komme langsam Schritt für Schritt mit JSON klar.
Bis jetzt finde ich das gut, einfach handzuhaben.

Inhalt meiner Testdatei:
{
"0": {
"screenx": "1600",
"screeny": "900",
"font": "('NimbusSansL', 12)",
"font2": "('NimbusSansL', 14)",
"font2b": "('NimbusSansL', 14, 'bold')",
"font3": "('NimbusSansL', 16)",
"font3b": "('NimbusSansL', 16, 'bold')"
},
"1": {
"screenx": "1680",
"screeny": "1050",
"font": "('NimbusSansL', 12)",
"font2": "('NimbusSansL', 14)",
"font2b": "('NimbusSansL', 14, 'bold')",
"font3": "('NimbusSansL', 16)",
"font3b": "('NimbusSansL', 16, 'bold')"
}
}
Gebe Datensatz 1 aus:
import json

with open(filepath_json, 'r')as datei:
d = json.loads(datei.read())
print(d['1'])
Ergebnis:
{'screenx': '1680', 'screeny': '1050', 'font': "('NimbusSansL', 12)", 'font2': "('NimbusSansL', 14)", 'font2b': "('NimbusSansL', 14, 'bold')", 'font3': "('NimbusSansL', 16)", 'font3b': "('NimbusSansL', 16, 'bold')"}
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Zahlen sollten keine Strings sein, und die Fonts Listen:

Code: Alles auswählen

{
"0": {
    "screenx": 1600,
    "screeny": 900,
    "font": ["NimbusSansL", 12],
    "font2": ["NimbusSansL", 14],
    "font2b": ["NimbusSansL", 14, "bold"],
    "font3": ["NimbusSansL", 16],
    "font3b": ["NimbusSansL", 16, "bold"]
    }
}
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das Zahlen keine Zeichenketten sein sollten weiter gedacht und aus dem äusseren JSON-Objekt ein JSON-Array gemacht:

Code: Alles auswählen

[
  {
    "screenx": 1600,
    "screeny": 900,
    "font": [
      "NimbusSansL",
      12
    ],
    "font2": [
      "NimbusSansL",
      14
    ],
    "font2b": [
      "NimbusSansL",
      14,
      "bold"
    ],
    "font3": [
      "NimbusSansL",
      16
    ],
    "font3b": [
      "NimbusSansL",
      16,
      "bold"
    ]
  },
  {
    "screenx": 1680,
    "screeny": 1050,
    "font": [
      "NimbusSansL",
      12
    ],
    "font2": [
      "NimbusSansL",
      14
    ],
    "font2b": [
      "NimbusSansL",
      14,
      "bold"
    ],
    "font3": [
      "NimbusSansL",
      16
    ],
    "font3b": [
      "NimbusSansL",
      16,
      "bold"
    ]
  }
]
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Danke, für Euren Input, das hilft um anfängliche Fehler zu reduzieren.

Beim umwandeln der Text-Datei in die JSON-Datei, habe ich dies verwendet.
y, wurde durch json.dump in einen String umgewandelt.
Dachte dass der Int-Wert übernommen wird.
# Prepare data for json-format.
dict1 = {}
for y, line in enumerate(data):
for i, value in enumerate(line):
head = head_label.lower()
try:
dict1[y].update({head : value.strip()})
except KeyError:
dict1[y] = {head : value.strip()}
# Convert dict1 in json-format and save in filepath_json.
out_file = open(filepath_json, "w")
json.dump(dict1, out_file, indent=4, sort_keys=False)
out_file.close()


Ist ein Array besser, als das Beispiel von __deets__, oder kommt es auf den Anwendungsfall an?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein Array ersetzt explizite Schluessel durch Positionen. Bei wenigen Eintraegen ist das ggf. verschmerzbar, aber wenn man mehr Optionen bekommt, dann hat man irgendwann den Nerv, dass man die defaults hinschreiben muss, wenn man etwas nicht-default setzen will. Beispiel:

font-name, groesse=10, farbe=black, weight=bold

Wenn du jetzt mit einem Array eigentlich neben dem Namen nur das Gewicht aendern willst, MUSST du schreibe

ZapfDingbats, 10, black, italic

Und wehe du aenderst den default.

Beim dict reicht die Angabe der gewuenschten Schluessel.

Ob das eine "besser" ist als das andere, haengt dann also sehr davon ab, was man da eigentlich macht, und wie man das einschaetzt. Gehen tut offensichtlich beides.
Antworten