Nach jedem Buchstaben im String etwas einfügen

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
Eierlikörchen
User
Beiträge: 17
Registriert: Dienstag 3. November 2020, 12:42

Ich möchte gerne mit Python eine große Datei (>200MB) einlesen und dann in jeder Zeile nach jedem Buchstaben das Zeichen * einsetzen.

Also aus :
Hallo
Berlin

soll:
H*a*l*l*o
B*e*r*l*i*n
werden.

Mein Code sieht bisher so aus. Wie bekomme ich es hin, dass nicht nach jeder Zeile, sondern nach jedem Buchstaben das Zeichen eingesetzt wird.
Muss ich Besonderheiten beachten bzgl. der großen Dateien?
Vielen Dank für Eure Hilfe.

Code: Alles auswählen

with open('test.txt','r') as f:
    for char in f:
        print (char+ '*')
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du dir mal die Dokumentation zu print anschaust, und ein weiteres argument angibst, damit es da zu keiner neuen Zeile kommt.
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Eierlikörchen: Dein Beispiel passt nicht zur Beschreibung. Du sagts Du möchtest nach jedem Buchstaben ein "*" einsetzen, aber im Beispiel passiert das nicht — da werden die "*" zwischen die Buchtaben gesetzt. Würden sie *nach* jedem Buchstaben gesetzt, müsste das Beispiel ja "H*a*l*l*o*" lauten für die erste Zeile.

Das bekommst Du hin in dem Du nicht nach jeder Zeile, sondern nach jedem Zeichen einen "*" setzt. Du solltest dringend `char` in `line` umbenennen, denn dieser Wert steht für eine Zeile nicht für ein Zeichen. `f` ist jetzt auch nicht der beste Name. Da wäre `lines` treffend, oder `file`.

Beim öffnen von Textdateien sollte man immer die Kodierung angeben in der die Daten gespeichert sind.

Grundsätzlich kann der Hinweis von __deets__ ein Teil der Lösung sein, aber eventuell ist es einfacher das Zeilenendezeichen nach dem einlesen zu entfernen. Und dann die `join()`-Methode auf Zeichenkette anzuschauen. Die kann beliebige iterierbare Objekte bekommen, die Zeichenketten liefern. Und praktischerweise sind Zeichenketten genau solche Objekte. Die liefern beim iterieren die einzelnen Zeichen als Zeichenketten.

Dann stellt sich natürlich noch die Frage wie ernst das „nach“ (oder „zwischen“) jedem *Buchstaben* gemeint ist/war. Was soll bei "Hallo, Welt!" passieren? Da sind ja nicht nur Buchstaben drin.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Eierlikörchen
User
Beiträge: 17
Registriert: Dienstag 3. November 2020, 12:42

Hallo blackjack,

Danke für die Antwort. Du hast Recht, ich habe einen Fehler bei der Beschreibung gemacht.
Das * soll nicht nach, sondern vor einen Buchstaben oder Zeichen stehen.
In jeder Zeile der .txt steht nur ein Wort. Leerzeichen gibt es je Zeile nicht.

"Hallo,Welt!" (ohne Leerzeichen) soll so aussehen:

*H*a*l*l*o*,*W*e*l*t*!

Danke und Gruß
Sirius3
User
Beiträge: 18278
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier geht es um Stringverarbeitung. Hast Du Dir dazu schon die Dokumentation und den Abschnitt in Deinem Tutorial durchgelesen? Welche Funktion könnte denn hilfreich sein?
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal spasseshalber eine Lösung in Literate CoffeeScript, die einer Python-Lösung recht ähnlich ist:

Code: Alles auswählen

% ~~Stars~~ Asterisks everywhere
%
% 2022-10-23

# Assignment

Read lines from a potentially large (>200 MB) file, and print the lines with „*“
characters between each character.

Example input file:

```
Hello
World
```

Expected output:

```
H*e*l*l*o
W*o*r*l*d
```

# Requirements

Just standard library stuff to open a file and read it line by line.

    fs = require "fs"
    readline = require "readline"

# The main function
    
Create a reader object to process the file line by line.  `crlfDelay` is set so
_carriage return_ followed by a _newline_ is read as one _newline_ character.
Sort of the „universal newlines“ settings in [Python](https://www.python.org/).

    main = ->
        reader = readline.createInterface
            input: fs.createReadStream "test.txt"
            crlfDelay: Infinity

Sprinkle ~~stars~~ asterisks between the characters for each line from the
reader, and print that to the console.

        console.log line.split("").join("*") for await line from reader

Have an explicit `null` return value, so _CoffeeScript_ doesn't generate code to
collect the results of the loop iterations in an array.  Especially as the
assignment states the potential size of the input file(s) in the hundrets of
megabytes.

        null

----

Now call the main function.

    main() if require.main == module

And we are done.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten