String in Liste in einzelne Listen-Elemente aufteilen

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
Twantie
User
Beiträge: 10
Registriert: Mittwoch 18. Dezember 2019, 09:24

Hallo,
ich habe ein Problem, mit welchem ich mich seit Stunden beschäftige. Ich bin neu in Python und habe die Aufgabe bekommen, einen Adressbuch-Text mit folgendem Aufbau:
Geschlecht,Vorname,Nachname,Strasse,Ort,Plz,EMail,Telefon,Geburtsdatum,Nordkoordinate,Ostkoordinate
mit 20 verschiedenen Adressen in eine Liste von Listen abzuspeichern.
Dies habe ich folgendermaßen gelöst

Code: Alles auswählen

rd = rd.open("FakeAdressen.txt","r")
i = rd.readlines()
fakeAdressen = [[i[x]] for x in range(20)]
rd.close
ich habe nun eine Liste, welche Listen mit einem einzigen Element beinhaltet, nämlich Geschlecht,Vorname,Nachname,Strasse,Ort,Plz,EMail,Telefon,Geburtsdatum,Nordkoordinate,Ostkoordinate als einzelnen String.
Am Ende jeder Liste hängt zwar noch das "\n", bei dem ich auch nicht weis wie ich das entfernen kann. Sämtliche variationen von strip() und replace() habe ich bereits versucht. Dies ist jedoch das geringere Problem.
Das eigentliche Problem ist, dass ich in der darauffolgenden Aufgabe automatisch generierte Briefe verfassen soll, in denen die jeweiligen Daten der Adressen benutzt werden sollen. Ich weis jedoch nicht, wie ich auf die Namen und Adressen in den einzelnen Strings zugreifen soll, bzw wie ich den String in einzelne Elemente der Liste ändern kann.

Ich weis das solche Probleme ungern gesehen sind, jedoch will ich keine Komplettlösung für die Aufgabe, sondern nur einen Hinweis, wie ich die Strings zu behandeln habe, sodass das automatische Briefschreiben funktioniert.

Danke im Vorraus!
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Das öffnen von Dateien sollte in ein einem with-statement passieren, damit man sich das Schließen sparen kann.

Warum willst du eine Liste, deren Elemente Listen mit einem einzigen Element sind? Ich gehe davon aus, das ist ein Unfall beim Ausprobieren, denn sinnvoll ist das nicht.

Du solltest Variablen sinnvolle Namen geben. "i" ist für mich ein Index, bei dir nicht. Schön sind sprechende Namen. In deinem Fall so etwas wie "lines".

Zeichenketten in Pyhton kennen die .split() Methoden. Die wird dir weiterhelfen.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@Twantie: wie ist das Datenformat exakt? Zum Lesen von Komma-Separierten Daten gibt es das csv-Modul, das Du nutzen solltest.
Einbuchstabige Namen sind selten sinnvoll. Vor allem, wenn man damit etwas ganz anders verbindet. `x` ist nicht der Name für einen Index und `i` auch keiner für eine Zeile. Was ist denn `rd` für ein Objekt? Zweibuchstabige Namen sind daher auch ganz schlecht, vor allem, wenn man sie offensichtlich an verschiedene Typen bindet.
Variablennamen schreibt man klein_mit_unterstrich: fake_adressen

Funktionen sollte man auch aufrufen `rd.close()`. Hier besser aber mit `with`.
Twantie
User
Beiträge: 10
Registriert: Mittwoch 18. Dezember 2019, 09:24

@Sirius3 also die Textdatei sieht so aus:

M,Mathias,Zimmer,Buelowstrasse 82,Oberrod,56479,MathiasZimmer@gmx.de,02664 99 74 68,27.03.1982,50.530761,7.980033
M,Torsten,Müller,Paderborner Strasse 23,Erdweg,85253,TorstenMuller@kabel.de,08254 27 03 80,31.05.1991,48.310973,11.335096
M,Thomas,Neudorf,Fontenay 41,Kronach,96313,ThomasNeudorf@gmx.de,09261 66 53 16,07.07.1946,50.273421,11.407716
W,Angelika,Nussbaum,An Der Urania 60,Husum,25805,AngelikaNussbaum@rhyta.com,04841 42 23 87,16.08.1932,54.561832,9.151079
M,Jonas,Weissmüller,Sonnenallee 34,Augsburg,86044,JonasWeissmuller@telekom.de,0821 51 24 61,13.04.1968,48.353975,10.910581
M,Stefan,Busch,Alt-Moabit 22,Wurzen,4801,StefanBusch@1und1.de,03425 65 19 75,28.06.1956,51.380197,12.837981
M,Felix,Herz,Kastanienallee 98,Osteel,26529,FelixHerz@1und1.de,04934 60 24 76,08.12.1997,53.450546,7.20508
W,Martina,Bumgarner,Hardenbergstraße 50,Rehweiler,66907,MartinaBumgarner@vodafon.de,06383 47 26 81,15.02.1946,49.480584,7.435079
M,Steffen,Mayer,Kurfürstenstraße 8,Eschenbach,92671,SteffenMayer@kabel.de,07161 56 96 94,27.01.1981,48.676098,9.628519
M,Kevin,Kastner,Charlottenstrasse 48,Cottbus,3050,KevinKastner@gmx.de,0355 58 83 10,19.02.1948,51.733721,14.431042
W,Susanne,Weissmüller,Rosenstrasse 3,München,81675,SusanneWeissmuller@telekom.de,089 70 86 18,11.11.1957,48.220319,11.695522
M,Marcel,Boehm,Alter Wall 43,Gollhofen,97258,MarcelBoehm@cuvox.de,09339 89 94 42,31.12.1978,49.52431,10.159784
M,Michael,Konig,Inge Beisheim Platz 40,Kirchgellersen,21394,MichaelKonig@cuvox.de,04135 75 33 09,14.11.1935,53.277876,10.155416
W,Johanna,Boehm,Genslerstraße 91,Berlin Schöneberg,10825,JohannaBoehm@vodafon.de,030 75 91 23,17.02.1940,52.541938,13.395334
W,Daniela,Hartmann,Gubener Str. 9,Rosenheim,83026,DanielaHartmann@web.de,08031 69 53 65,25.06.1934,47.833694,12.01175
W,Leonie,Klug,Rohrdamm 59,Bad Salzuflen Holzhausen,32108,LeonieKlug@cuvox.de,05208 70 42 84,03.02.1970,52.049233,8.826827
M,Florian,Jung,Gotzkowskystrasse 55,Dohr,56812,FlorianJung@rhyta.com,02671 63 54 64,28.02.1993,50.092006,7.101282
M,Martin,Gersten,Rudower Strasse 18,Lascheid,54597,MartinGersten@telekom.de,06556 10 73 02,16.10.1970,50.28629,6.515705
W,Heike,Herman,Messedamm 93,Dresden,1131,HeikeHerman@kabel.de,0351 74 61 85,08.03.1974,51.086195,13.790194
W,Sarah,Köhler,Invalidenstrasse 96,Ruppertsberg,67152,SarahKoehler@web.de,06326 93 97 78,02.06.1993,49.333561,8.207738


und ja, die Namen der Variablen sind ungünstig. Ich würde sie auch nie so benennen wenn ich ein normales Programm schreiben würde. Ich habe das nur gemacht, weil "i" und "x" schnell zu schreiben sind und das Programm nur wenige Zeilen beinhaltet.
Nach Aufgabenstellung sollte ich die Datei zunächst einlesen, und dann über eine ListComprehension eine Liste von Listen erstellen.
Und das rd habe ich von meinem Professor gesagt bekommen. Soll für read directory stehen.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Wobei ich auch gerade nicht denke, dass die erste von dir gezeigte Zeile so funktioniert.

Wenn das csv-Modul nicht verwendet werden soll, dann ist - wie bereits geschrieben - die .split()-Methode auf Zeichenketten dein Freund.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Es bleibt die Frage, welche Typen `rd` hat? Und warum zwei verschiedene? Gute Variablennamen sind auch bei ganz kurzen Programmen wichtig. Weil Du hängst jetzt an einem Problem, das vielleicht gar nicht auftreten würde, wenn Du besser wüßtest, was in den einzelnen Variablen steht.

So sähe Dein Programm aus, wenn man sinnvolle Strukturen und Namen benutzt:

Code: Alles auswählen

read_directory = rd # was auch immer read_directory ist
with read_directory.open("FakeAdressen.txt","r") as lines:
    fake_addressen = [line for line in lines]
Jetzt mußt Du noch in der List-Comprehension die Zeilen in einzelne Felder aufteilen.
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Twantie hat geschrieben: Mittwoch 18. Dezember 2019, 10:51 @Sirius3 also die Textdatei sieht so aus:

M,Mathias,Zimmer,Buelowstrasse 82,...........
Ich hoffe doch für dich, dass das Dummy Daten sind, oder?
Denn wenn ich jetzt Mathias Zimmer wäre und alle anderen Angaben auch stimmen, würde ich dir den Arsch aufreißen und deinen Kopf da reinstecken.

https://www.datenschutz.org/verstoss/
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zumindest die Adressen scheinen gefaked, habe 2-3 geprueft. Darum hab' ich das erstmal trotz einer (natuerlich richtigen Meldung!) online gelassen.
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

aha... aber an dem Professor scheinen die Namenskonventionen, das Python Strings eine `format` Methode haben und div. andere Sachen auch vorbei gegangen zu sein...

Hier würde es sich IMHO auch sehr anbieten, jeden Datensatz in ein NamedTuple zu packen.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Erwarte von Professoren keine idiomatischen Programme. Der will denen Programmieren beibringen, nicht Python.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten