Binär Datei durchsuchen

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
tomduli
User
Beiträge: 1
Registriert: Dienstag 3. Mai 2011, 19:54

Hallo zusammen,

ich bin absoluter Python Neuling. Hab schon ewig im Netz gesucht und keine Antwort gefunden.
Ich habe folgendes Problem:
In einer Menge Binärdateien befinden sich jeweils am ENDE der Datei Informationen im "normlen" ASCI Text Format.
Jetzt soll in diesem Text ein bestimmter String gesucht werden und wenn dieser gefunden ist die Datei kopiert werden.
Gemacht habe ich das im moment mit dem line.find.
Jetzt habe ich das Problem das manche Dateien in denen sich der String befindet tortzdem nicht kopiert werden. Ich habe den Verdacht das beim Durchsuchen der Datei irgendwo durch Zufall das "EOF" Zeichen für Text Dateien kommt und Python damit das suchen aufhört weil es denkt "die Datei ist zuende".

Weiß jemand rat wie ich das hin kriegen kann das auf alle Fälle bis zum Ende gesucht wird oder woran es sonst noch liegen könnte ?

Viele Grüße,

Tomduli
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Wenn die Dateien nicht zu groß sind, kannst du einfach alles auf einmal einlesen (`.read`) und dann von hinten (`.rfind`) oder vorn (`.find`) in den String suchen.
Benutzeravatar
snafu
User
Beiträge: 6745
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Dauerbaustelle: Ist das wirklich so, dass von hinten gesucht wird? In der Doku steht ja erstmal nur, das quasi das letzte Vorkommen des gesuchten Strings angezeigt wird. Das sagt für mich jetzt nicht unbedingt etwas über das implementierte Vorgehen der Funktion aus.

Die Frage des Threaderstellers ist damit übrigens nicht beantwortet. Diese ist ja, ob man mit Python über das EOF hinauslesen kann.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich denke mal die Lösung ist es, die Datei eben als Binärdatei zu öffnen, zur betreffenden Stelle zu springen (``seek``) und den letzten Teil als Text zu behandeln.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

snafu hat geschrieben:Die Frage des Threaderstellers ist damit übrigens nicht beantwortet. Diese ist ja, ob man mit Python über das EOF hinauslesen kann.
Na klar, `read` liest immer bis zum Ende. Das war gefragt.
BlackJack

@snafu: Auch wenn es da nicht explizit steht wäre es schon *ziemlich* blöd implementiert wenn `rfind()` nicht von hinten sucht.

@Dauerbaustelle: Ob `read()` wirklich bis zum Ende liest hängt vom Betriebssystem und dem Modus beim öffnen ab. Bei Windows hört's bei als Textdatei geöffneten Dateien beim EOF auf.
Antworten