Datei 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.
Antworten
MaggiFix

Hallo an alle.

Ich beschäftige mich noch nicht lange mit Python und schreibe gerade ein Programm das Dateien packt und danach in mehrere Dateien von 10MB aufsplittet.

Das Packen mit bz2 sowie das unterarchivieren mittels tar funktioniert dank des Moduls tarfile reibungslos, nur mit dem splitten der .tar.bz2 -Datei habe ich so meine Probleme.

Meine Frage:
Kennt jemand von Euch einen Weg dies zu realisieren?

Ach und ganz nebenbei, wie wandelt man INT in String oder CHAR um?


Für Eure Antworten vielen Dank im vorraus!


MfG
MaggiFix
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Mal ganz nebenbei:

Code: Alles auswählen

x = 3
y = str(x)
Gruß, mawe
MaggiFix

THX mawe !

Das hilft mir schonmal weiter. Manchmal ist die Lösung so simpel das man sie garnicht wahrnimmt.

Nochmal zu meinem anderen Problem:

Ich habe mir gedacht, dass man aus der Datei die gesplittet werden soll immer 10MB liest und diese dann in eine neue Datei schreibt. Danach wird mittels seek() der FilePointer verschoben und von der neuen Position an wieder 10MB gelesen und in eine weitere Datei geschrieben usw.

Was denkt Ihr, könnte das funktionieren oder bin ich auf dem Holzweg?


MfG
MaggiFix
joe

Hi!
MaggiFix hat geschrieben:Ich habe mir gedacht, dass man aus der Datei die gesplittet werden soll immer 10MB liest und diese dann in eine neue Datei schreibt. Danach wird mittels seek() der FilePointer verschoben und von der neuen Position an wieder 10MB gelesen und in eine weitere Datei geschrieben usw.
Im prinzip geht das so. Nur, seek() brauchst du nicht , da durchs lesen mit z.B. read() ja eh immer der zeiger ans ende des gelesenen blocks gesetzt wird.
joe
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi,

versuche doch mal folgendes (Achtung: Nicht ausprobiert! Du mußt den Code natürlich für Dich anpassen.):

Code: Alles auswählen

import os
chunksize = 1024 * 1024 * 10 #10 Mb

count = 0
def split(fname, path, chunksize = chunksize):
    """
    Funktion wird die Eingabedatei (=fname) in Teile von der Groesse von
    chunksize (default = 10 Mb) hacken und nach path ausschreiben
    """
    infile = open(fname,'rb')
    while 1:
        chunk = infile.read(chunksize)
        if not chunk: break
        count += 1
        name = os.path.join(path,('teil%4d'%count)
        outfile = open(name,'wb')
        outfile.write(chunk)
        outfile.close()
   infile.close()
   return count #wieviele Dateien wurden ausgeschrieben?

def join(fromdir, fname,chunksize = chunksize):
    """
    Funktion wird Dateien in fromdir aufnehmen und zu fname zusammenfuegen
    """
    output = open(fname,'wb')
    teile = os.listdir(fromdir)
    teile.sort()
    for datei in teile:
        dateipfad = os.path.join(fromdir,datei)
        input = open(dateipfad,'rb')
        while 1:
            fbytes = input.read(chunksize)
            if not fbytes: break
            output.write(fbytes)
        input.close()
    output.close()
Habe ich jetzt nur mal kurz aus dem Gedächnis zusammengestückelt und mag fehlerhaft sein. Aber hilft hoffentlich trotzdem.

Gruß,
Christian
MaggiFix

joe hat geschrieben: Im prinzip geht das so. Nur, seek() brauchst du nicht , da durchs lesen mit z.B. read() ja eh immer der zeiger ans ende des gelesenen blocks gesetzt wird.
Aha!
Deswegen haben meine Versuche nicht hingehauen, obwohl mir das hätte von Anfang an einleuchten müssen :oops:
Dank Dir joe !
CM hat geschrieben:

Code: Alles auswählen

if not chunk: break
Ich nehme mal an das diese if-Anweisung in der Funktion split die Schleife unterbrechen soll sobald EOF erreicht ist, oder!?

Danke auch für die Veranschaulichung zum zusammenfügen der Datei!

Es ist nur gut zu wissen das ich nicht völlig daneben lag :)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi,

ja, richtig: Wenn nur Teile kleiner als chunksize gelesen werden können (was immer der Fall sein wird, wenn Deine Datei nicht ein Vielfaches von chunksize ist), dann gibt es ein Problem. Ich würde versuchen den Fehler abzufangen und den Rest des Files separat abspeichern - Du weißt ja mit dem count-Zähler wo in der Eingabedatei Du bist, auf das Byte genau.
Aber das überlasse ich Dir - schließlich ist das nur ein Freitagabend-kurz-vorm-Ausgehen-Skript gewesen. ;-)

Schönes Wochenende,
Christian
Antworten