selektiv Daten aus massiver txt Datei löschen

Das einzige was ich noch lesen kann bevor sich das skript schließt ist "list index out of range"
wie kann ich das fenster offen lassen?
 
hoerenraph schrieb:
Das einzige was ich noch lesen kann bevor sich das skript schließt ist "list index out of range"
wie kann ich das fenster offen lassen?
Klingt schwer danach, als ob es irgendwo auch eine Zeile ohne Doppelpunkt gibt und deshalb die index-Methode sozusagen Out-Of-Range zugreifen will, weil das von split erzeugte Array nur ein Eintrag hat und das ist an Position 0. Position 1 (wie abgefragt) wäre dann nicht existent.

Möglicherweise auch eine Leerzeile. Z.B. ne Leerzeile am Dateiende.
Ergänzung ()

hoerenraph schrieb:
wie kann ich das fenster offen lassen?
Na z.B. vorher schon ein Cmdline-Fenster aufmachen und darin das Skript starten. Oder halt via Eigenschaften lässt sich bestimmt einstellen, dass Fenster nach dem beenden des Programms offen zu lassen.
 
Zuletzt bearbeitet:
Ui ok
Also müsste man abfragen ob die Zeile einen Doppelpunkt hat und wenn nicht überspringen?
Würde sich das einfach umsetzen lassen?
 
Versuchs mal hiermit:
Code:
input_file = 'in.txt'
output_file = 'out.txt'
 
out_file = open(output_file, 'w+')
 
with open(input_file) as f:
    for line in f:
        try:
             if ":" in line:
                  out_file.write(line.split(':')[1])
             else:
                  print("line without \":\". Omitting line!")

        except Exception as e:
             print(e)
 
out_file.close()
 
das wird eigentlich schon durch den try, except block abgefangen, die meldung wird ausgegeben, wenn was beim split/schreiben schief geht, aber er sollte weitermachen. mir machen die 4,x millionen zeilen irgendwie sorgen, nicht dass da eine 32bit limitierung ist. falls es das sein sollte gibts auch ne 64bit version. ich muss zugeben, mit solchen datenmengen habe ich noch nicht gearbeitet :)
 
0x8100 schrieb:
das wird eigentlich schon durch den try, except block abgefangen, die meldung wird ausgegeben, wenn was beim split/schreiben schief geht, aber er sollte weitermachen. mir machen die 4,x millionen zeilen irgendwie sorgen, nicht dass da eine 32bit limitierung ist.

Leider auch mit der Doppelpunkt Abfrage wieder die gleiche Meldung und die gleiche Größe :(
Ergänzung ()

Meine Lieben,
ich danke euch allen, für heute muss ich leider los aber ich werde mich morgen wieder melden.
 
Zuletzt bearbeitet:
Wie 0x8100 schon gesagt hat, würde ich es auch mal mit der 64bit Python Distribution versuchten.
Möglicherweise läuft Python beim Einlesen der Datei über das Speicherlimit von 32bit. Das sollte eigentlich nicht sein, weil die Datei ja on-the-fly in die neue Datei geschrieben wird. Der "Fehler" könnte also beim Iterieren über f liegen. (for line in f).
Trotzdem ein bisschen komisch, weil Python ja mit Coroutines mit vielen Aufrufen auch keine Probleme hat.

Also wie gesagt, versuchs mal mit 64bit!
 
starte cmd.exe damit es dauerhaft offenbleibt und starte das python script da drin. Dann solltest du einen Stacktrace von ein paar Zeilen bekommen den du hier posten kannst.
 
Ein Integerwert sollte eigentlich mindestens 2^31-1 Werte annehmen können, also bis 2,1 Milliarden laufen und damit bei einer Datei die nur aus "\n" besteht 2GB Daten durchgrasen bevor etwas passiert. Wobei ab Python3 keinerlei Limit mehr besteht, außer dass der Arbeitsspeicher die Zahl vorhalten können muss.
 
Habs heute doch noch mal probiert,
hier ist die rückmeldung:

Code:
C:\Users\rapha\Desktop\DB>delete2.py
line without ":". Omitting line!
line without ":". Omitting line!
line without ":". Omitting line!
line without ":". Omitting line!
Traceback (most recent call last):
  File "C:\Users\rapha\Desktop\DB\delete2.py", line 7, in <module>
    for line in f:
  File "C:\Users\rapha\AppData\Local\Programs\Python\Python36\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 6970: character

Eine Versionsabfrage habe ich gemacht indem ich einfach mal py eingegeben habe:

Code:
C:\Users\rapha\Desktop\DB>py
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Ich denke das ist dann die 64-bit version oder muss ich die explizit starten?



ausgeführt wurde das hier:
Code:
input_file = 'C:/Users/rapha/Desktop/DB/all.txt'
output_file = 'C:/Users/rapha/Desktop/DB/all2.txt'
 
out_file = open(output_file, 'w+')
 
with open(input_file) as f:
    for line in f:
        try:
             if ":" in line:
                  out_file.write(line.split(':')[1])
             else:
                  print("line without \":\". Omitting line!")
 
        except Exception as e:
             print(e)
 
out_file.close()


Bedeutet das, dass ich für python nicht lesbare Zeichen in meiner Datei habe?
Kann man das irgendwie abfragen und diese Zeichen überspringen?
 
Zuletzt bearbeitet:
hoerenraph schrieb:
Habs heute doch noch mal probiert,
hier ist die rückmeldung:
Ah. Ein Encoding-Fehler. Python geht von einer anderen Textkodierung aus, als die Datei wirklich ist.
Weißt Du das zufällig?
UTF-8?
ISO-8859-15?
usw.

Ansonsten kann man natürlich auch noch Encoding-Fehler behandeln und notfalls dann eben einfach mit der nächsten Zeile weiter machen und Zeilennummer mit der problematische Zeile ausgeben, so dass Du sie "von Hand" migrieren kannst.

Aber da melden sich sicher gleich die Python-Profis. :-)
 
Probier mal statt

Code:
with open(input_file) as f:

Folgendes aus:

Code:
with open(input_file,encoding="ISO-8859-1") as f:

Das ist natürlich nur spekulativ. Falls Du die richtige Encodierung weißt, musst du die entsprechend anpassen.
Häufig ist aber "ISO-8859-1" verwendet worden, wenn es nicht UTF-8 ist. :-)

Ja, deine Pythonumgebung ist 64bit!
 
Zuletzt bearbeitet:
Danke :)
Jetzt wirds aber nicht besser :D
Ich habe die Datei mit ultraedit geöffnet und nochmal als utf8 abgespeichert
Jetzt hat sich die Dateigröße grad mal verdoppelt
 
hoerenraph schrieb:
Danke :)
Jetzt wirds aber nicht besser :D
Ich habe die Datei mit ultraedit geöffnet und nochmal als utf8 abgespeichert
War auch keine gute Idee, weil Du jetzt evtl. noch mehr kaputt gemacht hast. Wichtig ist vor allem das Encoding der Quelldatei rauszubekommen. Wenn Ultraedit das zulässt, einfach mal die Dir Datei in gängigen Zeichensätzen anschauen. Wenn keine "komischen" Zeichen mehr auftreten und Umlaute etc. korrekt dargestellt werden, hast Du den richtigen Zeichensatz gefunden.
 
sieht so aus als wäre es 1252
also das ganz normale ascii?
wie sage ich python, dass es das benutzen soll?
 
Deine Fehlermeldung enthält, dass das Byte mit Wert 0x81 (also hexadezimal: 81, Dezimal 129) eben keine Entsprechung in ASCII hat. Weiteres zu ASCII bringt dir das www nach kurzer Suche.

Auch wie du Python dazu bringst datein als Latin, UTF8 etc. zu interpretieren bringt das Netz zu Tage. Nur eine kurze Suche entfernt.
 
Also nach rumprobieren welche codierung benutzt wird hat jetzt alles geklappt!

Vielen Vielen Dank euch allen!
 
Zurück
Oben