DOS <--> Unix Converter [Bitte Testen!]

Code-Stücke können hier veröffentlicht werden.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

DOS <--> Unix Converter [Bitte Testen!]

Beitragvon EnTeQuAk » Samstag 18. November 2006, 18:01

Hallo!

Nachdem Gerold sich rangemacht hat zwei kleinere Scripte zu entwerfen um die Zeilenumbrüche jeweils fürs Betriebssystem zu ändern und ich in letzter Zeit viel mit denen zu tun hatte habe ich mir gedacht. Hmm. Machste ne "GUI" drauß.

Das ganze ist doch auf Konsole gebannt worden düfte allerdings nicht DAS Problem sein.


Es ist im Moment noch ungetestet (zumindest nicht alle Szenarien).

Ich würde mich sehr über Feedback jeder Art freuen!

Hier nun das Progrämmchen:

wie unten zu sehen --> im Moment nicht 100%ig funktionsfähig! Bitte hilf mir die Fehler zu finden!


Dies ist die aktuell neueste Version! Bitte austesten! Danke!


Es wird nach folgendem Shema benutzt:
python unix-dos-converter.py -d2u -o /path/to/directory

Code: Alles auswählen

#!G:\Server\Python\python.exe
# -*- coding: iso-8859-1 -*-

import os
from sys import argv



def dos2unix(filename):
    infile = file(filename, "rb")
    outfile = tempfile.TemporaryFile()
    for line in infile:
        line = line.replace("\r\n", "\n")
        outfile.write(line)
    infile.close()
    infile = file(filename, "wb")
    outfile.seek(0)
    for line in outfile:
        infile.write(line)
    infile.close()
    outfile.close()


def unix2dos(filename):
    infile = file(filename, "rb")
    outfile = tempfile.TemporaryFile()
    for line in infile:
        line = line.replace("\r\n", "\n")
        line = line.replace("\n", "\r\n")
        outfile.write(line)
    infile.close()
    infile = file(filename, "wb")
    outfile.seek(0)
    for line in outfile:
        infile.write(line)
    infile.close()
    outfile.close()



try:
    argv[1]
    z = 1
    print 'Parameterliste in argv: ' , argv
    for i in argv:
        try:
            if str(argv[z]) in ['-o', '-O']:
                dir_path = z + 1
                dir_path = argv[dir_path]
                try:
                    for file in os.listdir(dir_path):
                        for i in argv:
                            if str(i) in ['-d2u', '-D2U']:
                                dos2unix(file)
                                print 'habe %s erfolgreich geaendert!' % file
                            elif str(i) in ['-u2d', '-U2D']:
                                unix2dos(file)
                                print 'habe %s erfolgreich geaendert!' % file
                            else:
                                print 'Bitte aehle -d2u   oder   -u2d'
                                break
                except OSError:
                    print 'Der Ordner, den du ausgewaehlt hast - %s - existiert nicht!' % dir_path
            elif argv[z] in ['-f', '-F']:
                file_path = z + 1
                file_path = argv[file_path]
                try:
                    for i in argv:
                        if str(i) in ['-d2u', '-D2U']:
                            dos2unix(file_path)
                            print 'habe %s erfolgreich geaendert!' % file_path
                        elif str(i) in ['-u2d', '-U2D']:
                            unix2dos(file_path)
                            print 'habe %s erfolgreich geaendert!'% file_path
                        else:
                            print 'Bitte waehle -d2u   oder   -u2d'
                            break
                except:
                    break
        except IndexError:
            pass
        z+=1


except IndexError:
    print 'Unix - DOS - Converter'
    print '----------------------\n'
    print 'Bitte waehle einen der folgenden Befehle beim aufrufen des Scriptes!\n'
    print '-d2u                         Aendere die Zeilenumbrueche von DOS zu Unix'
    print '-u2d                         Aendere die Zeilenumbrueche von Unix zu DOS'
    print '-o path/to/directory         Aendere die Zeilenumbrueche von allen Dateien im Ordner'
    print '-f path/to/file.txt          Aendere die Zeilenumbrueche einzig und allein von einer Datei'
    print
    print 'Zum Beispiel:    -d2u -o /path/to/directory'


Aktuelle Version : vom 19. Nov 18:24 Uhr

MfG EnTeQuAk
Zuletzt geändert von EnTeQuAk am Sonntag 19. November 2006, 18:54, insgesamt 7-mal geändert.
BlackJack

Beitragvon BlackJack » Samstag 18. November 2006, 23:05

Da ist eine Menge "copy'n'paste" Quelltext, der sich nur geringfügig ändert. Den kann man in Funktionen verfrachten.

Zum Beispiel eine Funktion die eine Liste mit Dateien umwandelt. Die Richtung DOS/Unix oder Unix/DOS ist ein Argument für diese Funktion. Am besten machst Du zwei Argumente, nämlich was durch was ersetzt werden soll. Dann kann man diese Funktion auch für DOS/Mac, Unix/Mac, Mac/DOS und Mac/Unix verwenden.

Wenn der Anwender ein Verzeichnis konvertieren möchte dann kannst Du eine Liste mit den Dateinamen übergeben, wenn es eine einzelne Datei sein soll, dann steckst Du den einzelnen Namen einfach als einziges Element in eine Liste. Und schon sind aus den vier ``if``-Fällen nur noch zwei geworden.

Das Abfragen eines Menüpunkts kannst Du in eine Funktion stecken, dann brauchst Du die ``while``-Schleife nur einmal und `expression` kannst Du einsparen wenn Du eine Endlosschleife (``while True:``) benutzt, die im Erfolgsfall mit ``break`` verlassen wird.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Samstag 18. November 2006, 23:53

@EnTeQuAk:
Werde ich mal morgen testen. Hab momentan keine Unix Datei (muss irgendwo erstmal eine finden) bei der Hand, da ich nur Windows habe.

lg
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 19. November 2006, 00:12

XtraNine hat geschrieben:Werde ich mal morgen testen. Hab momentan keine Unix Datei (muss irgendwo erstmal eine finden) bei der Hand, da ich nur Windows habe.

Kannst dir eine erstellen, unterstützt jeder bessere Editor wie SciTE, vim oder UltraEdit.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Sonntag 19. November 2006, 00:38

@EnTeQuAk:
Habs getestet und es geht bei mir nicht.

Traceback:

Code: Alles auswählen

Dos - Unix - Converter!
-----------------------


Please chose your desire!

(1) - convert DOS files to UNIX ones
(2) - convert UNIX files to DOS ones
------------------------------------
Your desire (please use only the number!):  1

Please chose your kind of converting!

(1) - convert only one file
(2) - convert more files - in a directory
Your desire (please use only the number!):  1

-------------------

You desire to convert one DOS file to a UNIX one

Please let me know what is the path to the file!
input (please a absolute path!):  C:\Dokumente und Einstellungen\Sape\__test
Traceback (most recent call last):
  File "test.py", line 102, in <module>
    dos2unix(file)
  File "test.py", line 54, in dos2unix
    infile = file(filename, "rb")
TypeError: coercing to Unicode: need string or buffer, type found


Traceback2:

Code: Alles auswählen

Dos - Unix - Converter!
-----------------------


Please chose your desire!

(1) - convert DOS files to UNIX ones
(2) - convert UNIX files to DOS ones
------------------------------------
Your desire (please use only the number!):  1

Please chose your kind of converting!

(1) - convert only one file
(2) - convert more files - in a directory
Your desire (please use only the number!):  1

-------------------

You desire to convert one DOS file to a UNIX one

Please let me know what is the path to the file!
input (please a absolute path!):  C:\Dokumente und Einstellungen\Sape\__test\test.txt
Traceback (most recent call last):
  File "test.py", line 102, in <module>
    dos2unix(file)
  File "test.py", line 54, in dos2unix
    infile = file(filename, "rb")
TypeError: coercing to Unicode: need string or buffer, type found
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 19. November 2006, 10:58

Beim ersten ist das halbwegs klar. Der erste Punkt ist für only one file :D

Allerdings wundert es mich, das er irgentetwas mit Unicode bemängelt.

Mal schauen. Nachdem ich BlackJack 's Vorschläge umgesetzt habe würd ich mich über erneutes Testen freuen ;)


Danke schonmal!

MfG EnTeQuAk
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Sonntag 19. November 2006, 16:03

Mich würde es ganz schön nerven, wenn ich einen Befehl eingeben muss und mich dann auch noch durch eine komische Menüstruktur hangeln.

Abgesehen davon ist input() bäh.
BlackJack

Beitragvon BlackJack » Sonntag 19. November 2006, 17:13

Jup, ein Kommandozeilenprogramm mit Argumenten wäre nützlicher. Die Unterscheidung zwischen Datei und Verzeichnisinhalt müsste man dann auch nicht im Programm selbst machen -- wenn jemand ein ganzes Verzeichnis umgewandelt haben möchte, dann gibt er halt auf der Shell ein * ein.

Übrigens fragte ich mich gerade was "eine Zeile einlesen" eigentlich bei Dateien die im Binärmodus geöffnet wurden, für eine Bedeutung hat!?
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 19. November 2006, 18:25

Ich habe die aktuelle Version oben geändert.

Ich habe es zu einem Kommandozeilen Programm umgeformt ;)

War ne gute Idee :D

Danke nochmal für eure ganzen Schreiben.

Bitte probiert doch das neue auch aus.




EDIT:

habe nach eigenem Testen selbst herausgefunden, das es so nicht geht...
warum weiß ich immo net.
Wie kann ich denn nochmal vergleichen, ob ein Ausdruck in einer Liste ist oder nicht.
So oder:

Code: Alles auswählen

>>> list = ['dos-unix-converter.py', '-f', 'test.txt', '-d2u']
>>> if list in ['-d2u']:
...     print 'ist drinne'
... else:
...     print 'is net drinne'
...
is net drinne

Nur wie zu sehen ist, geht das so nicht.
Wie ging das nochmal?


EDIT:
Habs herausgefunden ;)
So muss das heißen:

Code: Alles auswählen

>>> list = ['dos-unix-converter.py', '-f', 'test.txt', '-d2u']
>>> if list in ('-d2u'):
...     print 'ist drinne'
... else:
...     print 'is net drinne'
...
is net drinne

Habs verbessert!

Bitte mal ausprobieren! ;)

Danke!


MfG EnTeQuAk
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Sonntag 19. November 2006, 18:40

Code: Alles auswählen

>>> "a" in ["a", "b", "c"]
True


Uebrigens: Vielleicht waere das optparse-Modul was fuer dich.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 19. November 2006, 18:47

Ohh habs geändert ;)

Ganz vergessen, das man nur einzelne Zeichenketten überprüfen kann.

Ich hoffe die Lösung mit einer '' for '' Schleife, die alle Argumente einzeln durchgeht ist halbwegs in Ordnung.

Habe das obere Script verbessert!
Allerdings geht das auch net so ganz.

Bei mir kommt immer folgender Fehler.

Code: Alles auswählen

ente@Proggi-PC:~/Desktop$ python dos-unix-converter.py -f test.txt -d2u
['dos-unix-converter.py', '-f', 'test.txt', '-d2u']
Bitte waehle -d2u   oder   -u2d


Wie mache ich die Überprüfung an den folgenden Stellen besser bzw. so, das sie Funktioniert?

Code: Alles auswählen

try:
    for file in os.listdir(dir_path):
        for i in argv:
            if str(i) in ['-d2u', '-D2U']:
                dos2unix(file)
                print 'habe %s erfolgreich geaendert!' % file
            elif str(i) in ['-u2d', '-U2D']:
                unix2dos(file)
                print 'habe %s erfolgreich geaendert!' % file
            else:
                print 'Bitte aehle -d2u   oder   -u2d'
                break
except OSError:
    print 'Der Ordner, den du ausgewaehlt hast - %s - existiert nicht!' % dir_path

An der Stelle für einzelne Dateien ist das ja recht das gleiche.

Danke für jeden Hinweis!

Danke für den Tipp. Das Modul werde ich mir mal anschauen!


MfG EnTeQuAk
BlackJack

Beitragvon BlackJack » Sonntag 19. November 2006, 19:33

EnTeQuAk hat geschrieben:Bei mir kommt immer folgender Fehler.

Code: Alles auswählen

ente@Proggi-PC:~/Desktop$ python dos-unix-converter.py -f test.txt -d2u
['dos-unix-converter.py', '-f', 'test.txt', '-d2u']
Bitte waehle -d2u   oder   -u2d


Wie mache ich die Überprüfung an den folgenden Stellen besser bzw. so, das sie Funktioniert?

Code: Alles auswählen

try:
    for file in os.listdir(dir_path):
        for i in argv:
            if str(i) in ['-d2u', '-D2U']:
                dos2unix(file)
                print 'habe %s erfolgreich geaendert!' % file
            elif str(i) in ['-u2d', '-U2D']:
                unix2dos(file)
                print 'habe %s erfolgreich geaendert!' % file
            else:
                print 'Bitte aehle -d2u   oder   -u2d'
                break
except OSError:
    print 'Der Ordner, den du ausgewaehlt hast - %s - existiert nicht!' % dir_path


Geh das doch einfach mal in Gedanken durch. `i` wird in der Schleife nacheinander an alle Werte von `argv` gebunden. Als erstes an 'dos-unix-converter.py'. Das ist weder '-d2u' noch '-u2d', also wird die Meldung ausgegeben.

`i` ist übrigens ein äusserst unglücklicher Name für etwas das keine Integerzahl ist. Zusätzlich mit dem ``str(i)`` hat mich das ganz schön verwirrt. Warum wandelst Du Zeichenketten in Zeichenketten!?

An der Stelle für einzelne Dateien ist das ja recht das gleiche.


Was wieder ein guter Hinweis ist, das etwas mit dem Entwurf nicht stimmt. Soviel nahezu identischer Quelltext ist schlecht. Wenn Da irgendwo eine Änderung vorgenommen werden muss, dann muss man immer daran denken die an allen "ähnlichen" Stellen auch zu machen.

Für die Schnittstelle des Programms würde ich keine Optionen benutzen sondern nur Argumente. Die ersten beiden geben Quell- und Ziel-Zeilenenden an und dann folgen die Dateinamen.

converter.py unix dos datei1 datei2 verzeichnis/* ...
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Sonntag 19. November 2006, 19:49

Oke. Jetzt setz ich mich erstmal vor den Fernseher und dann gehts morgen weiter ;)


Danke für die Hinweise BlackJack!
Werde sie versuchen so gut es geht umzusetzen.



MfG EnTeQuAk
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 20. November 2006, 10:57

Da der Konverter sowieso nur von DOS nach Unix gemacht, hätte ich ihn so gemacht, dass er das jeweils eine Format in der jeweils andere Format automatisch konvertiert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Montag 20. November 2006, 15:23

Dann brächte ich ja rein theoretisch nur schauen, ob in einer Linie ein "\n\r" oder nur ein "\n" vorkommt.

Das wäre tatsächlich einfach.

Ich schaue mal, wie ich das hinbekomme.

Danke für den Tipp.

Gestern bin ich auch schon etwas weiter gekommen. Eventuell stelle ich zwei Versionen rein ;)


Ma so ne andere Frage. Wie speichert MacOS die Zeilenumbrüche?

MfG EnTeQuAk

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder