Dateien Splitten

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.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ich will eine Datei in lauter gleichgroße stücke aufteilen, mit 'normalen' textdateien geht das schon, aber z. B. mit Worddateien geht das nicht, ich weiß ich muss die dateien im binärmodus öffnen, aber da kommt ein fehler nach dem anderen. Wie krieg ich das hin :?:

Code: Alles auswählen

def split(path, size=512):
   def verbleibendezeichen(string, durchlauf):
      return len(string)-durchlauf
   inhalt2=''
   count=0
   count2=1
   f=open(path, 'r')
   inhalt=f.read()
   f.close()
   for zeichen in inhalt:
      inhalt2+=str(zeichen)
      if len(inhalt2)==size:
         f2=open(pfad+name+str(count)+'.spl', 'w')
         f2.write(inhalt2)
         f2.close(); count+=1; inhalt2=''
      count2+=1
      if verbleibendezeichen(inhalt, count2)<0:
         f2=open(pfad+name+str(count)+'.spl', 'w')
         f2.write(inhalt2)
         f2.close(); count+=1; inhalt2=''
         break
(Das zusammen 'kleben' der einzelnen stücker sollte das kleinere Porblem sein.)
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

mit > 200 Beiträge solltest du doch langsam folgendes wissen:
- bei Fehlermeldungen diese Posten
- with open(...) as fh: ist besser als 'nur' open

Word-Dateien kannst du nicht splitten, ausser du 'parst' die Datei.
lunar

@DaMutz: Wieso sollte man Word-Dateien nicht trennen können? Wenn man eine Word-Datei (oder allgemein eine beliebige Binärdatei) zerstückelt und anschließend in identischer Reihenfolge zusammensetzt, erhält man eine identische Datei, die Word problemlos laden kann.
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

da habe ich etwas falsch verstanden sorry :oops:
Ich dachte er wolle Word Dateien zerstückeln und die einzelnen Stücke sollten dann immer noch in Word darstellbar sein. Sprich ein 100-seitiges Dokument auf 100 Dateien mit je einer Seite splitten.
Benutzeravatar
noisefloor
User
Beiträge: 4262
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du eine Binär-Datei (wie Word 2003) teilen willst, musst du wohl mit Bytes statt Zeichen arbeiten.

Vom Prinzip sollte folgendes funktionieren:

* Datei öffnen
* die ersten X Bytes abzählen
* diese in eine neue Datei speichern
* so lange wiederholen, was man am Dateiende ist

Gruß, noisefloor
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

noisefloor hat geschrieben:Hallo,

wenn du eine Binär-Datei (wie Word 2003) teilen willst, musst du wohl mit Bytes statt Zeichen arbeiten.

Vom Prinzip sollte folgendes funktionieren:

* Datei öffnen
* die ersten X Bytes abzählen
* diese in eine neue Datei speichern
* so lange wiederholen, was man am Dateiende ist

Gruß, noisefloor
Genau das macht doch mein programm schon.

Wenn ich die datei im binärmodus öffne, habe ich lauter zerstückelte dateien, die mit zahlen volgeschrieben sind.
Wenn ich an der stelle wo ich das nächste byte in die variable schreibe, das str() weglasse kommt diese fehlermeldung:

TypeError: Can't convert 'int' object to str implicitly

@DaMutz das mit der Worddatei war nur einbeispiel, ich will nicht nur Worddateien splitten.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
lunar

@Py-Prog: Erwartest Du ernsthaft sinnvolle Hilfe angesichts dieser Fehlerbeschreibung? Dir ist offenbar nicht einmal klar, worin der Unterschied besteht zwischen Text- und Binärmodus, und was eine Binärdatei tatsächlich enthält.
Benutzeravatar
noisefloor
User
Beiträge: 4262
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

nee, du arbeitest Zeichen-orientiert, nicht Byte-Orientiert.

Probier' doch mal was mit FileIO aus dem io Modul. Das arbeitet rein auf Byte-Ebene, also ziemlich "low-level".

Gruß, noisefloor
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Gibts da irgend wo ne referenz? (Nein ich will kein tuturial.)
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
noisefloor
User
Beiträge: 4262
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

klar. io ist Teil der Standardbibliotheken von Python.

http://docs.python.org/library/io.html

Gruß, noisefloor
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

noisefloor hat geschrieben:Probier' doch mal was mit FileIO aus dem io Modul. Das arbeitet rein auf Byte-Ebene, also ziemlich "low-level".
File Objects reichen völlig aus um das gewünschte Ziel zu erreichen. Das Problem ist allerdings, dass der Fragesteller nicht mal das Tutorial anschauen möchte. Ich schätze die Chance für eine ausreichende Beschäftigung mit der Dokumentation daher nicht als besonders gut ein.

Zu wissen, dass man Dateien im Binärmodus öffnen muss ist schön. Hätte der Fragesteller das Tutorial durchgearbeitet, dann wüsste er auch wie es ginge. Vor allem wüsste er dann auch nicht nur, dass es einen Binärmodus gibt, sondern auch, was das eigentlich bedeutet.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

/me hat geschrieben: Hätte der Fragesteller das Tutorial durchgearbeitet, dann wüsste er auch wie es ginge.

Code: Alles auswählen

f=open(pfad, 'rb')
Wie war das? Wenn ich eine Textdatei 'normal' öffne dann krieg ich den text unferändert mit sonderzeichen wie z. B. ä, ö, ü. Wenn ich aber die Textdatei im Binärmodus öffne, dann werden die Sonderzeichen z. B. zu /xc3, aber das müsste dann doch gehen, aber die datei ist ja mit lauter zahlen voll, und mit welcher funktion soll das gehen? (Und ja, mir ist auf gefallen das im binärmodus vor dem Text b' und am ende ' steht.)
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Wenn Du die Datei im Textmodus öffnest, dann liest Du den Dateiinhalt nicht unverändert, denn in der Datei sind Bytes, die werden beim Einlesen in Zeichen umgewandelt.

Wenn Du sie im Binärmodus öffnest, dann werden die Bytes eingelesen. In den entsprechenden Datentyp, nämlich `bytes`. Und dessen Darstellung als Zeichenkette beginnt mit b' und endet mit ' und dazwischen werden *für die Darstellung* Bytewerte ausserhalb des ASCII-Wertebereichs als Escape-Sequenz mit \x umgewandelt. Viele Bytewerte liessen sich sonst nicht vernünftig oder zumindest nicht eindeutig darstellen. Und man will ja sehen was da drin steht, wenn man zum Beispiel einen Fehler sucht.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Aber die diese escapezeichen, sind doch strings, wieso kann geht das dann nicht?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Weil das nur die `repr()`-Darstellung ist. Schau Dir doch einfach mal an was `zeichen` bei Dir für einen Typ hat.

Letztendlich ist das aber sowieso nicht wirklich praktikabel da mit einzelnen Zeichen/Bytes zu hantieren. Das dauert viel zu lange. Kopiere die Daten lieber blockweise. Und das auch beim Einlesen. Denn Dein Programm wird Probleme bei grossen Dateien bekommen.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

BlackJack hat geschrieben:Letztendlich ist das aber sowieso nicht wirklich praktikabel da mit einzelnen Zeichen/Bytes zu hantieren. Das dauert viel zu lange. Kopiere die Daten lieber blockweise. Und das auch beim Einlesen. Denn Dein Programm wird Probleme bei grossen Dateien bekommen.
Ich hab versucht auf denen Tipp einzugehen, ich weiß aber nicht ob du es so ungefär gemeint hast:

Code: Alles auswählen

def split(path, size=1024):
   count=0
   f=open(path, 'rb')
   inhalt=f.read()
   f.close()
   helpfile=[name.replace('/', '')+'\n']
   inhalt=inhalt[2: len(inhalt)-1]
   while True:
      if ((count*size)+size)>len(inhalt):
         helpfile.append(name+str(count)+'.spl\n')
         f2=open(pfad+name+str(count)+'.spl', 'wb')
         f2.write(inhalt[count*size: len(inhalt)])
         f2.close(); break
      else:
         helpfile.append(name+str(count)+'.spl\n')
         f2=open(pfad+name+str(count)+'.spl', 'wb')
         f2.write(inhalt[count*size: (count*size)+size])
         f2.close(); count+=1
   f3=open(pfad+name+'Help.hlp', 'w')
   f3.writelines(helpfile)
   f3.close()

def unsplit(pfad):
   f=open(pfad, 'r')
   info=f.readlines()
   f.close(); os.chdir(os.path.dirname(pfad))
   f2=open(os.path.join(os.getcwd(), info[0].replace('\n', '')), 'wb')
   del info[0]
   for datei in info:
      f3=open(os.path.join(os.getcwd(), datei.replace('\n', '')), 'rb')
      f2.write(f3.read())
      f3.close()
   f2.close()
Es gibt ein Problem, der Pfad bei f3, müsste doch stimmen, aber laut der fehlermeldung versucht f3 datei.replace('\n', '') zu öffnen ohne das arbeitsverzeichnis. was ist falsch?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

Py-Prog hat geschrieben:Es gibt ein Problem, der Pfad bei f3, müsste doch stimmen, aber laut der fehlermeldung versucht f3 datei.replace('\n', '') zu öffnen ohne das arbeitsverzeichnis. was ist falsch?
Viel zu viel:
- keine Fehlermeldung
- bei split() hast du sowohl path als auch pfad
- name ist nicht definiert
- das with Konstrukt sollte man verwenden
- was gibt ein print datei.replace('\n', '') aus?
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ja ich habs geschaft, lag an den slash beim zusammen setzten und daran das ich beim aufteilen die ersten 2 und das letzte zeichen gelöscht habe! Jetzt müsste ich noch wießen wie ich dateien mit with öffne, hab beim Googeln nichts gefunden. (Jetzt bau ich noch nen GUI und dann ab ins showcase)

DANKE!!!

Ich hab schon gelaubt ich bin zublöd um was zuprogrammieren.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

http://effbot.org/zone/python-with-statement.htm oder hier im Forum wirst du immer wieder dieses Konstrukt sehen...
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Jetzt muss ich blos noch den GUI bauen, wobei das design wohl das größere problem ist als das programmierern.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Antworten