Seite 1 von 2
Dateien Splitten
Verfasst: Samstag 20. November 2010, 18:19
von Py-Prog
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.)
Re: Dateien Splitten
Verfasst: Samstag 20. November 2010, 18:39
von DaMutz
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.
Re: Dateien Splitten
Verfasst: Samstag 20. November 2010, 19:50
von 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.
Re: Dateien Splitten
Verfasst: Samstag 20. November 2010, 20:01
von DaMutz
da habe ich etwas falsch verstanden sorry
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.
Re: Dateien Splitten
Verfasst: Samstag 20. November 2010, 20:23
von noisefloor
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
Re: Dateien Splitten
Verfasst: Sonntag 21. November 2010, 19:55
von Py-Prog
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.
Re: Dateien Splitten
Verfasst: Sonntag 21. November 2010, 20:08
von 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.
Re: Dateien Splitten
Verfasst: Sonntag 21. November 2010, 20:14
von noisefloor
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
Re: Dateien Splitten
Verfasst: Sonntag 21. November 2010, 20:33
von Py-Prog
Gibts da irgend wo ne referenz? (Nein ich will kein tuturial.)
Re: Dateien Splitten
Verfasst: Sonntag 21. November 2010, 20:51
von noisefloor
Hallo,
klar. io ist Teil der Standardbibliotheken von Python.
http://docs.python.org/library/io.html
Gruß, noisefloor
Re: Dateien Splitten
Verfasst: Sonntag 21. November 2010, 22:47
von /me
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.
Re: Dateien Splitten
Verfasst: Montag 22. November 2010, 17:15
von Py-Prog
/me hat geschrieben:
Hätte der Fragesteller das Tutorial durchgearbeitet, dann wüsste er auch wie es ginge.
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.)
Re: Dateien Splitten
Verfasst: Montag 22. November 2010, 18:26
von 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.
Re: Dateien Splitten
Verfasst: Donnerstag 25. November 2010, 16:28
von Py-Prog
Aber die diese escapezeichen, sind doch strings, wieso kann geht das dann nicht?
Re: Dateien Splitten
Verfasst: Donnerstag 25. November 2010, 18:09
von 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.
Re: Dateien Splitten
Verfasst: Donnerstag 2. Dezember 2010, 15:15
von Py-Prog
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?
Re: Dateien Splitten
Verfasst: Donnerstag 2. Dezember 2010, 18:32
von DaMutz
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?
Re: Dateien Splitten
Verfasst: Freitag 3. Dezember 2010, 15:44
von Py-Prog
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.
Re: Dateien Splitten
Verfasst: Freitag 3. Dezember 2010, 18:37
von DaMutz
http://effbot.org/zone/python-with-statement.htm oder hier im Forum wirst du immer wieder dieses Konstrukt sehen...
Re: Dateien Splitten
Verfasst: Freitag 3. Dezember 2010, 20:06
von Py-Prog
Jetzt muss ich blos noch den GUI bauen, wobei das design wohl das größere problem ist als das programmierern.