Seite 1 von 2
String in Tuple umwandeln
Verfasst: Dienstag 26. Juli 2022, 15:55
von Nobuddy
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
Re: String in Tuple umwandeln
Verfasst: Dienstag 26. Juli 2022, 16:03
von __deets__
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.
Re: String in Tuple umwandeln
Verfasst: Dienstag 26. Juli 2022, 18:03
von Nobuddy
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.

Re: String in Tuple umwandeln
Verfasst: Dienstag 26. Juli 2022, 18:10
von sparrow
CSV-Dateien liest man mit dem csv Modul ein.
Re: String in Tuple umwandeln
Verfasst: Dienstag 26. Juli 2022, 18:36
von Nobuddy
Habe mich falsch ausgedrückt.
Sind keine CSV-Dateien, sondern Textdateien im CSV-Format (Tab-getrennt).
Re: String in Tuple umwandeln
Verfasst: Dienstag 26. Juli 2022, 19:03
von Sirius3
Zum Lesen von Textdateien im CSV-Format gibt es das csv-Modul.
Re: String in Tuple umwandeln
Verfasst: Dienstag 26. Juli 2022, 19:10
von narpfel
Nobuddy hat geschrieben: Dienstag 26. Juli 2022, 18:36
Sind keine CSV-Dateien, sondern Textdateien im CSV-Format (Tab-getrennt).
Was ist der Unterschied?
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 06:30
von Nobuddy
Mit CSV, habt Ihr Recht und ich benutze auch das csv-Modul zum laden solcher Dateien. Da war ich gestern, leicht neben der Spur.
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.
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 07:18
von sparrow
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?
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 16:05
von Nobuddy
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!?
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 16:19
von __deets__
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.
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 16:59
von snafu
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...
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 17:56
von Nobuddy
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
Re: String in Tuple umwand
Verfasst: Mittwoch 27. Juli 2022, 17:58
von __deets__
@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.
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 18:08
von Sirius3
@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.
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 18:52
von Nobuddy
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')"}
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 19:10
von Sirius3
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"]
}
}
Re: String in Tuple umwandeln
Verfasst: Mittwoch 27. Juli 2022, 21:41
von __blackjack__
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"
]
}
]
Re: String in Tuple umwandeln
Verfasst: Donnerstag 28. Juli 2022, 14:33
von Nobuddy
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?
i
Verfasst: Donnerstag 28. Juli 2022, 14:41
von __deets__
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.