Textdatei durchsuchen und bestimmte Sachen speichern

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
Python-Nichtskönner
User
Beiträge: 15
Registriert: Donnerstag 30. April 2020, 10:14

Ich möchte in Python aus einer Text Datei nur eine bestimmte Sache speichern. Ich habe zufallsgenerierte 100000 Kombination bestehend aus 4 Buchstaben in der Textdatei gespeichert. Nun will ich aus diesen 100000 Kombination nur diese speichern, bei denen 3 gleiche Kombinationen aufeinander folgen... Also z.B. möchte ich nur ..., ABBA, ABBA, ABBA, .... CCAC, CCAC, CCAC, ... Speichern.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was hast du denn schon versucht?

Warum machst du das nicht dort, wo die Daten generiert werden, sondern schreibst erst unnötigerweise die Datei?
Python-Nichtskönner
User
Beiträge: 15
Registriert: Donnerstag 30. April 2020, 10:14

sparrow hat geschrieben: Samstag 2. Mai 2020, 10:02 Was hast du denn schon versucht?

Warum machst du das nicht dort, wo die Daten generiert werden, sondern schreibst erst unnötigerweise die Datei?
Also generiert hab ich die Kombination in Python und nur abgespeichert in einer Textdatei. Ich dachte, dass ich in dem neuen Programm nun die Textdatei öffnen muss, die ich generiert hab
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Python-Nichtskönner: Das beantwortet nicht wirklich die Frage warum Du das nicht schon beim generieren der Daten machst, also solche 3er-Gruppen aus den Daten filtern. Wobei die nächste Frage dann natürlich wäre warum überhaupt 100.000 Kombinationen generieren wenn man danach eh nur wieder welche raus filtert, warum nicht gleich nur solche 3er-Gruppen generieren?

Und jetzt sind es exakt drei gleiche Kombinationen? Im letzten Thema zum im Grunde gleichen Thema waren es noch mindestens drei statt exakt drei: viewtopic.php?f=1&t=48468#p365957:
Python-Nichtskönner hat geschrieben:Ich will ich in einem zweiten Programm nur einen bestimmten Code speichern, bei dem mindestens einmal drei gleiche Kombinationen nebeneinander stehen. Also ...,ACCA, ACCA, ACCA, ...
Die erste Frage von sparrow hast Du auch noch nicht beantwortet: Was hast Du versucht?

Wo liegt jetzt das konkrete Problem?

Und wie soll eigentlich das Ergebnis aussehen? Sollen da jetzt wirklich Auslassungspunkte und Kommas im Ergebnis stehen? Oder nur die 3er-Gruppen durch Leerzeichen getrennt, oder…

Programmieren erfordert ein gewisses Mass an Präzision. Wenn man das Problem nicht präzise beschreiben kann, wird man in der Regel auch bei der Formulierung der Lösung Probleme haben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Python-Nichtskönner
User
Beiträge: 15
Registriert: Donnerstag 30. April 2020, 10:14

__blackjack__ hat geschrieben: Samstag 2. Mai 2020, 10:18 @Python-Nichtskönner: Das beantwortet nicht wirklich die Frage warum Du das nicht schon beim generieren der Daten machst, also solche 3er-Gruppen aus den Daten filtern. Wobei die nächste Frage dann natürlich wäre warum überhaupt 100.000 Kombinationen generieren wenn man danach eh nur wieder welche raus filtert, warum nicht gleich nur solche 3er-Gruppen generieren?

Und jetzt sind es exakt drei gleiche Kombinationen? Im letzten Thema zum im Grunde gleichen Thema waren es noch mindestens drei statt exakt drei: viewtopic.php?f=1&t=48468#p365957:
Python-Nichtskönner hat geschrieben:Ich will ich in einem zweiten Programm nur einen bestimmten Code speichern, bei dem mindestens einmal drei gleiche Kombinationen nebeneinander stehen. Also ...,ACCA, ACCA, ACCA, ...
Die erste Frage von sparrow hast Du auch noch nicht beantwortet: Was hast Du versucht?

Wo liegt jetzt das konkrete Problem?

Und wie soll eigentlich das Ergebnis aussehen? Sollen da jetzt wirklich Auslassungspunkte und Kommas im Ergebnis stehen? Oder nur die 3er-Gruppen durch Leerzeichen getrennt, oder…

Programmieren erfordert ein gewisses Mass an Präzision. Wenn man das Problem nicht präzise beschreiben kann, wird man in der Regel auch bei der Formulierung der Lösung Probleme haben.
Also mein Programm zu den zufallsgenerierten Kombinationen ist:

import random
Bausteine = 4
Kombinationen = 100000
buchstaben = ["A", "C", "B", "D"]
hinzu = ""
for i in range(Kombinationen):
for j in range(Bausteine):
buchstabe = random.choice(buchstaben)
hinzu += buchstabe
hinzu += " "
with open("text.txt", "w") as f:
f.write(hinzu)

Jetzt möchte ich entweder dieses Programm umschreiben, oder die zufallsgenerierte Liste (Textdatei) auf die 3 gleichen Kombinationen durchsuchen. Ihr meint ich soll das in diesem Programm hier machen? Ich hätte jetzt als Idee gehabt mit File open text.txt zu arbeiten. Problem ist, dass ich nicht weiß, wie ich die Liste durchsuchen soll.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die code-tags im vollstaendigen Editor benutzen. Das ist der </>-Knopf. Und NICHT den Post davor im Volltext zitieren. Den kann man davor ganz bequem lesen.
Python-Nichtskönner
User
Beiträge: 15
Registriert: Donnerstag 30. April 2020, 10:14

__deets__ hat geschrieben: Samstag 2. Mai 2020, 10:30 Bitte die code-tags im vollstaendigen Editor benutzen. Das ist der </>-Knopf. Und NICHT den Post davor im Volltext zitieren. Den kann man davor ganz bequem lesen.
Sorry bin neu hier
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und darum machst du dann auch gleich nochmal das, um dessen Unterlassung du gebeten wurdest?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Python-Nichtskönner: Zu der ineffizient, also einen handfesten *Problem* mit dem Code der die Kombinationen erzeugt, habe ich ja hier schon mal was gesagt: viewtopic.php?f=1&t=48468#p365964

Wenn Du die erzeugten Daten dann verarbeiten willst, ist es sowieso ungünstig die als *eine* grosse Zeichenkette vorliegen zu haben, denn die Ebene auf der Du operieren möchtest sind ja nicht die Zeichen sondern die 100.000 Kombinationen. Die müsste man in einer Datenstruktur wie einer Liste haben. Wenn man das aus einer Datei einliest, muss man sie in diese Form bringen. Wenn man das gleich im Programm löst, das die Daten erzeugt, sollte man da gleich so eine Liste erzeugen und nicht erst eine Riesenzeichenkette.

Und Du beantwortest keine Nachfragen, wie soll man da sinnvoll weiterhelfen können? Wenn das direkt in dem Programm passieren darf, stellt sich immer noch die dringende Frage warum Du überhaupt 100.000 Kombinationen erzeugst um danach dann welche raus zu filtern, statt gleich nur die paar Kombinationen zu erzeugen die Du tatsächlich haben willst‽

Und die Frage danach wie das Ergebnis *konkret* aussehen soll, hast Du auch noch nicht beantwortet.

Hier mal in CoffeScript das filtern von Kombinationen die exakt dreimal hintereinander in einer Datei vorkommen:

Code: Alles auswählen

#!/usr/bin/env coffee
{readFileSync, writeFileSync} = require 'fs'


load = (filename) -> readFileSync(filename, 'ascii').trimRight().split /\s+/


runLengthEncode = (items) ->
    previousItem = null
    count = 0
    
    for item in items
        if item == previousItem
            count++
        else
            yield [count, previousItem]
            previousItem = item
            count = 1

    yield [count, previousItem] if count > 0


filterRuns = (items, length) ->
    item for [count, item] from runLengthEncode items when count == length


save = (filename, items) -> writeFileSync filename, (items.join ' ') + '\n'


main = -> save 'test2.txt', filterRuns(load('test.txt'), 3)


main() if require.main == module
Das Prinzip dahinter also das „run length encoding“ (RLE) lässt sich in Python genau so umsetzen. Im externen `more_itertools`-Modul gibt es ein `run_length.encode()` das man sich nicht selber schreiben muss.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten