@sfx2k: Das `textwrap`-Modul kann mehr und macht eigentlich ja auch ein bisschen etwas anderes als Du da brauchst. Das ist der Sonderfall den man in den Eingabedaten eigentlich nicht haben möchte, weil die ”Lösung” so hässlich ist Worte mittendrin einfach umzubrechen.
Allerdings ist Deine Lösung auch nicht wirklich gut weil da wenn's blöd läuft so an die 228 GiB an Daten im Arbeitsspeicher herumkopiert werden und Du wahrscheinlich einfach nur Glück hast, dass dieser Sonderfall in CPython in der Regel optimiert abläuft. Verlassen darf man sich da aber nicht drauf. Zeichenketten sind unveränderlich. Auch ein ``+=`` erzeugt eine neue Zeichenkette mit der Länge der alten beiden und die werden dann in diesen Speicherbereich kopiert. Wenn man das also in einer Schleife macht, in der diese Zeichenkette immer länger und länger wird, werden immer mehr und mehr Daten in jedem Durchlauf kopiert. Da Du das Zeichenweise machst, im ersten Durchlauf 1 Zeichen, im zweiten 2, im dritten 3, und im 700tausendsten 700.000, und da sind noch nicht mal die '\n' mitgezählt. Gesamt macht dass dann also mindestens die Summe von 1 bis 700.000:
Was Dich hier rettet ist das CPython bei Zeichenketten auf die es nur eine Referenz gibt beim ``+=`` schummelt und die Zeichenkette doch veränderbar macht. Sieht ja ausser dem einzigen Besitzer der Referenz niemand, und der bekommt das erwartete Ergebnis. Das geht so aber nur bei einer Speicherverwaltung die auf Referenzzähler setzt. Bei alternativen Python-Implementierungen wie IronPython oder Jython, die den jeweiligen Garbage Collector von .NET bzw. der JVM verwenden, geht das nicht, und auch bei CPython ist nicht garantiert das die Speicherverwaltung nicht irgendwann einmal geändert wird.
Es sieht auch recht kompliziert aus. Ich würde einfach die Eingabedatei in Blöcken zu x Bytes laden und dann jeweils mit einem '\n' in die Zieldatei schreiben.