Filesplitter

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Manchmal frag ich mich echt wieso ich mir eigentlich eine Referenz gekauft habe. Wenn ich da mal besser lesen würde, hätte ich schon einige Antworten auf meine Fragen gefunden. :oops: :oops: :oops:
Ich werd mich dann mal an die Arbeit machen.

(Und wenn ich fertig bin wundert euch nicht wenn eine Datei die Vorher einen Zeilen Umbruch hatte danach keinen mehr hat. Sorry aber das muss sein.)
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

So BlackJack, jetzt kannst du dein DVD-Image splitten! :D
Modul und GUI

Also die Hauptsächlichen Änderungen sind, das die Dateiendung nicht mehr angezeigt wird und die datei wird auch nicht komplett gelesen. Zeilen Umbrüche in den Dateinamen werden Gelöscht, weil im helpfile der Dateiname nur in die Erste Zeile stehen darf, ich hoffe das ist zu verschmerzen.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Jetzt muss ich noch eine funktion schreiben die aus der Helpdatei eine Batch datei erzeugt die das wieder zusammenfügt.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Das Neue Modul

Code: Alles auswählen

import os.path

def create_batch_file(path, end_path):
    with open(path, 'r') as helpfile:
        info=helpfile.readlines()
        name=info[0].replace('\n', ''); del info[0]
        batch_file_text='COPY /B '
        for filename in info:
            batch_file_text+='"'+filename.replace('\n', '')+'" '
            if filename!=info[len(info)-1]:
                batch_file_text+='+'
            else:
                batch_file_text+=' '+name
    with open(os.path.join(end_path, name+'.bat'), 'w') as batchfile:
        batchfile.write(batch_file_text)

def split(path, size, batchfile=False, end_path=None):
    path_name_list=os.path.split(path)
    directory=path_name_list[0]
    name=path_name_list[1].replace('\n', '')
    if end_path is None:
        end_path=directory
    count=0
    with open(path, 'rb') as f:
        filesize=os.path.getsize(path)
        filepart_info=[name.replace('/', '')+'\n']
        name=os.path.splitext(name)[0] #Löscht die endung des Dateinamen
        while True:
            if ((count*size)+size)>filesize:
                filepart_info.append((name+str(count)+'.spl\n'))
                with open(os.path.join(end_path, name+str(count)+'.spl'), 'wb') as splitfile:
                    splitfile.write(f.read(size))
                    break
            else:
                filepart_info.append(name+str(count)+'.spl\n')
                with open(os.path.join(end_path, name+str(count)+'.spl'), 'wb') as splitfile:
                    splitfile.write(f.read(size))
                    count+=1
                    f.seek(count*size)
    with open(os.path.join(end_path, name+'.help'), 'w') as helpfile:
        helpfile.writelines(filepart_info)
    if batchfile==True:
        create_batch_file(os.path.join(end_path, name+'.help'), end_path)

def join(path, end_path=None):
    if end_path is None:
        end_path=path
    with open(path, 'r') as helpfile:
        info=helpfile.readlines()
    with open(os.path.join(os.path.split(path)[0], info[0][0: len(info[0])-1]), 'wb') as unsplitfile:
        del info[0] #Löscht den Dateinamen aus der liste
        for datei in info:
            datei=datei[0: len(datei)-1]
            with open(os.path.join(end_path.replace('/', '\\'), datei), 'rb') as splitfile:
                unsplitfile.write(splitfile.read())



Der Neue GUI

Code: Alles auswählen

import tkinter
import tkinter.ttk
import tkinter.filedialog
import tkinter.messagebox
import os.path
import filesplitter

def split_window():
    def quelle_suchen():
        quelle=tkinter.filedialog.askopenfilename()
        quelle_entry.delete(0, 'end')
        quelle_entry.insert(0, quelle)
        ziel_entry.delete(0, 'end')
        ziel_entry.insert(0, os.path.dirname(quelle))
    def ziel_suchen():
        ziel=tkinter.filedialog.askdirectory()
        ziel_entry.delete(0, 'end')
        ziel_entry.insert(0, ziel)
    def umrechnen():
        bytetranslater={'Bytes': 0, 'Kibibytes': 10, 'Mebibytes': 20, 'Gibibytes': 30}
        inbytes=int(float(groesse_entry.get().replace(',', '.'))*2**bytetranslater[einheit_combobox.get()])
        return inbytes
    def make_split_file():
        try:
            filesize=umrechnen()
        except ValueError:
            tkinter.messagebox.showerror('Fehler', 'Geben sie eine Zahl ein!')
        except KeyError:
            tkinter.messagebox.showerror('Fehler', 'Wählen sie eine Einheit aus!')
        else:
            try:
                filesplitter.split(quelle_entry.get(), filesize, tkinter.messagebox.askyesno('Filesplitter', 'Soll eine Batchdatei erstellt werden?'), ziel_entry.get())
            except IOError:
                tkinter.messagebox.showerror('Fehler', 'Die Datei könnte nicht gesplittet werden!')

    split_window=tkinter.Toplevel()
    split_window.title('Filesplitter  Split')
    quelle_label=tkinter.Label(split_window, text='Quelle: ')
    quelle_label.grid(row=0, column=0)
    quelle_entry=tkinter.Entry(split_window, width=70)
    quelle_entry.grid(row=0, column=1)
    quelle_button=tkinter.Button(split_window, text='...', command=quelle_suchen)
    quelle_button.grid(row=0, column=2)
    ziel_label=tkinter.Label(split_window, text='Ziel: ')
    ziel_label.grid(row=1, column=0)
    ziel_entry=tkinter.Entry(split_window, width=70)
    ziel_entry.grid(row=1, column=1)
    ziel_button=tkinter.Button(split_window, text='...', command=ziel_suchen)
    ziel_button.grid(row=1, column=2)
    tkinter.Label(split_window).grid(row=2) #Erzeugt eine Leerzeile
    groesse_label=tkinter.Label(split_window, text='Größe: ')
    groesse_label.grid(row=3, column=0)
    groesse_entry=tkinter.Entry(split_window, width=70)
    groesse_entry.grid(row=3, column=1)
    einheit_label=tkinter.Label(split_window, text='Einheit: ')
    einheit_label.grid(row=4, column=0)
    einheitvar = tkinter.StringVar()
    einheit_combobox = tkinter.ttk.Combobox(split_window, textvariable=einheitvar, state='readonly')
    einheit_combobox['values'] = ('Bytes', 'Kibibytes', 'Mebibytes', 'Gibibytes')
    einheit_combobox.set('Mebibytes')
    einheit_combobox.grid(row=4, column=1)
    tkinter.Button(split_window, text='Splitten', command=make_split_file).grid(row=5, column=1)
    
def join_window():
    def infodatei_suchen():
        types=[('Informationsdatei',"*.help")]    
        infodatei=tkinter.filedialog.askopenfilename(filetypes=types)
        infodatei_entry.delete(0, 'end')
        infodatei_entry.insert(0, infodatei)
        ziel_entry.delete(0, 'end')
        ziel_entry.insert(0, os.path.dirname(infodatei))
    def ziel_suchen():
        ziel=tkinter.filedialog.askdirectory()
        ziel_entry.delete(0, 'end')
        ziel_entry.insert(0, ziel)
    def zusammenfügen():
        if os.path.isfile(infodatei_entry.get()) and os.path.isdir(ziel_entry.get()):
            try:
                filesplitter.join(infodatei_entry.get(), ziel_entry.get())
            except IOError:
                tkinter.messagebox.showerror('Fehler', 'Die Datei konnte nicht zusammen gefügt werden!')
        else:
            tkinter.messagebox.showerror('Fehler', 'Die angegebenen Pfäde sind nicht richtig eingegeben!')
    join_window=tkinter.Toplevel()
    join_window.title('Filesplitter  Join')
    infodatei_label=tkinter.Label(join_window, text='Infodatei: ')
    infodatei_label.grid(row=0, column=0)
    infodatei_entry=tkinter.Entry(join_window, width=70)
    infodatei_entry.grid(row=0, column=1)
    infodatei_button=tkinter.Button(join_window, text='...', command=infodatei_suchen)
    infodatei_button.grid(row=0, column=2)
    ziel_label=tkinter.Label(join_window, text='Ziel: ')
    ziel_label.grid(row=1, column=0)
    ziel_entry=tkinter.Entry(join_window, width=70)
    ziel_entry.grid(row=1, column=1)
    ziel_button=tkinter.Button(join_window, text='...', command=ziel_suchen)
    ziel_button.grid(row=1, column=2)
    tkinter.Button(join_window, text='Zusammenfügen', command=zusammenfügen).grid(row=2, column=1)

window=tkinter.Tk()
window.title('Filespliter')
window.geometry('500x30')
menubar=tkinter.Menu(window)
menu=tkinter.Menu(menubar)
menu.add_command(label='Splitten', command=split_window)
menu.add_command(label='Zusammenfügen', command=join_window)
menu.add_separator()
menu.add_command(label='Beenden', command=exit)
menubar.add_cascade(label='Datei', menu=menu)
window.config(menu=menubar)
tkinter.Label(window, text='Mit diesem Programm kann man Dateien Splitten und wieder zusammenfügen.').place(relx=0.2, rely=0.3)
tkinter.mainloop()

Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Filesplitter 1.8

Nur mal so:
wenn ich da schreibe

Code: Alles auswählen

string=string[0: len(string)-1]
könntet ihr auch mal sagen dass das auch so geht:

Code: Alles auswählen

string=string[: -1]
Und das beim entpacken in einem anderen Verzeichnis, die Datei immer noch im Gleichen Ordner landet, wie die spl Dateien. Ist jetzt aber alles verbessert und jetzt kann man auch einen Pfad eingeben der gar nicht existiert, der wird dann (falls möglich) erstellt. Natürlich nur bei Ziel.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Das das keiner gesagt hat, war mit Sicherheit keine pure Bosheit. Ich würde eher darauf tippen, das es keiner gesehen hatte, denn dein Script, könnte schon ein kleine Schönheitsoperation vertragen. Im besonderen könnte man mal nachsehen, welche Stellen man in kleinere Funktionen zerlegen könnte und die ein oder andere Leerzeile/-zeichen kann bei so einem Block auch nicht schaden.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Besser :?:
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Antworten