Seite 1 von 1

Splitter - Ein Split / Unsplit Skript

Verfasst: Mittwoch 10. September 2008, 16:11
von str1442
Hallö,

http://paste.pocoo.org/show/84927/

Splitet eine Gegebene Datei entweder nach Anzahl der Teile oder nach Größe jedes Teils in kleinere Dateien auf und fügt sie wieder zusammen.

mfg

Verfasst: Mittwoch 10. September 2008, 17:42
von rayo
Hi

Eine kleine Beschreibung wär ganz nett, damit nicht jeder den Quelltext anschauen muss um zu sehen was dein Code macht.

Die Speicheranforderunen sind ein wenig hoch wenn man z.B. 1GB grosse Blöcke erstellt, mach doch anstatt ein read mit voller Grösse mehrere kleine daraus.

Gruss

Verfasst: Mittwoch 10. September 2008, 18:05
von BlackJack
`split_files()` funktioniert nicht, wenn sowohl `parts` als auch `size` `None` sind. `last_size` ist überflüssig ─ wenn man mit `read()` mehr von einer Datei anfordert als sie enthält, dann wird eben einfach weniger bei dem Aufruf zurück gegeben.

``return None`` am Ende von Funktionen, deren Rückgabewert nicht interessiert, ist überflüssig und redundant, weil das implizit sowieso passiert wenn der Kontrollfluss das Ende einer Funktion erreicht.

Funktioniert `file_unsplit()` überhaupt? Wenn man die mit 'foo1.part' aufruft, dann ist in Zeile 86 `fil` = 'foo' und `suffix` = 'part' und die Bedingung sucht alle Dateien heraus, die 'foo.part' enthalten, was *keine* sein dürfte. In der nächste Zeile ist dann gleich das nächste Problem: Es wird alphabetisch sortiert, was bei mehr als 9 Teilen daneben geht, weil '10' zwischen '1' und '2' einsortiert wird. Hast Du das Programm überhaupt mal ausprobiert?

Defaultwerte kann man auch bei den Optionen schon mit angeben, dann braucht man später nicht so viel auf `None` testen.

Und Du solltest man suchen wo Du überall "Intenger" geschrieben hast. ;-)

Ergänzend zu rayo: Beim Aufteilen geht das vielleicht noch, aber das Zusammensetzen der Datei sollte wirklich nicht komplett im Speicher geschehen.

Verfasst: Mittwoch 10. September 2008, 18:39
von str1442
`split_files()` funktioniert nicht, wenn sowohl `parts` als auch `size` `None` sind. `last_size` ist überflüssig ─ wenn man mit `read()` mehr von einer Datei anfordert als sie enthält, dann wird eben einfach weniger bei dem Aufruf zurück gegeben.
Stimmt, das soll auch so sein, da man ansonsten keinen Anhaltspunkt hat, in welchen größen zu trennen ist - Wenn weder size noch parts per Kommandozeilenoption übergeben wird, "raist" die main Funktion einen Value Error - ich sollte das allerdings in split_file() abhandeln, richtig.
Funktioniert `file_unsplit()` überhaupt? Wenn man die mit 'foo1.part' aufruft, dann ist in Zeile 86 `fil` = 'foo' und `suffix` = 'part' und die Bedingung sucht alle Dateien heraus, die 'foo.part' enthalten, was *keine* sein dürfte. In der nächste Zeile ist dann gleich das nächste Problem: Es wird alphabetisch sortiert, was bei mehr als 9 Teilen daneben geht, weil '10' zwischen '1' und '2' einsortiert wird. Hast Du das Programm überhaupt mal ausprobiert?
Die Funktion schmeißt einen ValueError, wenn suffix + "1" nicht in in start_fil vorkommt - etwas rigide, da die 1 am Ende existieren muß und man somit auch den ersten Teil der Datei angeben muß, aber ich dachte, für ein kleines Skript wirds wohl schicken :lol:

wenn start_fil = "foo1.part" aufruft, gibt es einen ValueError, bei "foo1.part1" ist fil = "foo1", die LC sucht dann alle Dateien mit "foo1.part" im Namen raus, was dann alle Teile mit einem weiteren Integer sein dürften.

Die Sortierung der Liste bei Werten für i => 10 wird Falsch, Danke für den Hinweis. :!:

Ansonsten funktioniert die Funktion recht gut, ja ich habe sie getestet :D
Und Du solltest man suchen wo Du überall "Intenger" geschrieben hast. Wink
Das passiert mir immer wieder :?


read():

Also praktisch eine Datei zigmal öffnen und nacheinander mit "ab" reinschreiben?


Danke an Alle! :!:

Achja: Eine kleine Beschreibung editiere ich eben oben rein.

Verfasst: Mittwoch 10. September 2008, 22:46
von BlackJack
Der `ValueError` in der `main()` ist keine so tolle Lösung. Da bekommt der Anwender einen völlig unnötigen Traceback präsentiert, wo man eigentlich eine Anwenderfreundliche Fehlermeldung ausgeben sollte.

Zu den Dateinamen, da hatte ich etwas falsch verstanden. Jetzt also mit meinem (hoffentlich) richtigen Verständnis:

Du suchst nach '.part1' *innerhalb* des Dateinamens. Nun stell Dir mal vor jemand hat eine Datei 'TollerFilm.part1of2.avi' mit dem Programm aufgeteilt und wie das jetzt beim wieder Zusammensetzen in die Hose geht. Du willst doch eigentlich in keinem der Fälle wo Du auf ``in`` testest wissen ob die Zeichenkette *irgendwo* vorkommt, sondern ob sie am *Ende* steht.

Ich würde auch nicht die Dateinamen aus dem Verzeichnis lesen und sie sortieren, sondern sie genau wie beim splitten generieren. Dann fällt zum Beispiel auch sofort auf, wenn eine Datei zwischendrin fehlt. Und man kann die Funktion zum generieren der Dateinamen auslagern.

Und was meinst Du mit zigmal öffnen? Die Dateien die Du schreibst brauchst Du nur einmal öffnen, nur eben nicht den gesamten Inhalt auf einmal, sondern in kleineren Häppchen zwischen den offenen Dateien kopieren.

Verfasst: Donnerstag 11. September 2008, 21:21
von str1442
ValueError / Main:

Naja, ich wehre mich ein wenig gegen "print" als Ausgabe für Fehler - Selbst, wenn es um "high-level" Fehler geht, deswegen habe ich da einen ValueError stehen... Ich habs jetzt umgeändert und schmeiße in split_file den ValueError, und nutze print in der main.

part1 etc:

Richtig, aber die dortige Lösung war auch mehr eine Schnellreproduktion nachdem ich mich mit rstrip umgeärgert hab ^_^

(rstrip: Warum keine Liste verwenden, wen man den schon alle zeichen eines Strings einzeln betrachtet beim strippen?)

wie wärs mit:

Code: Alles auswählen

if a.endswith(b):
    a = a[:-len(b)]
Das sollte passen, wobei etwas unoffensichtlich auf den ersten Blick.

Ich werd ich demnächst dranmachen, poste ich dann hier. Danke nochmal :)