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:

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

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

@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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@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:

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

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

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:

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:

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:

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

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:

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Hm, wozu der ganze Aufwand? Unter Unixen gibt es oft die Scripte unix2dos und dos2unix, ansonsten sollte jeder gescheite, zum Programmieren geeignete Editor mit einem Klick das Konvertieren zwischen \n, \r und \r\n ermöglichen (z.B. SciTe).
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@Y0Gi:
Ist doch nicht schlecht und als Übung ganz gut.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

So ich bin am umüberlegen.

Die Abfrage, ob er Benutzer überhaupt etwas angegeben hat, ist ja einfach ;)

Code: Alles auswählen

try:
    argv[1]
except IndexError:
    print 'Bitte ein Argument angeben  [weiteres folgt.... ;) ]'
Allerdings möchte ich schon gerne Kontrollieren könne, ob der Benutzer nun einen Pfad als Argument agegeben hat, eine einzelne Datei oder halt nicht.

Welche Kriterien könnte man da nehmen?

Da wären in meinen Augen nur:

Zur Unterscheidung, ob ein Pfad angegeben wurde das suchen nach " / ".
Oder nach einem " * ". da einzelne Dateien ja direkt angegeben werden.

Ich habe im Moment noch nicht so die Phantasie wie die Benutzung ablaufen soll. Mit Argumenten denke ich schon.
Allerdings würde ich halt die Möglichkeit der Umwandlung einzelner Dateien und ganzer Ordner bieten wollen.

Wenn es möglich ist auch gleich für MacOS. Fals das die Zeilenumbrüche anders speichern sollte. Das weiß ich allerdings nicht.

Freue mich auf Hilfen/Hinweise.

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

Das ganze geht noch viel einfacher, wenn man die Dateien im "universal newline mode" öffnet. Dann konvertiert Python nämlich die Umbrüche automatisch in "\n".
BlackJack

EnTeQuAk hat geschrieben:Allerdings möchte ich schon gerne Kontrollieren könne, ob der Benutzer nun einen Pfad als Argument agegeben hat, eine einzelne Datei oder halt nicht.

Welche Kriterien könnte man da nehmen?

Da wären in meinen Augen nur:

Zur Unterscheidung, ob ein Pfad angegeben wurde das suchen nach " / ".
Man könnte auch einfach nachschauen ob es sich um eine Datei oder ein Verzeichnis handelt.
Oder nach einem " * ". da einzelne Dateien ja direkt angegeben werden.
Argh, da habe ich mal wieder nicht bedacht wie "braindead" Windows bzw. die Eingabeaufforderung dort ist. So ein * sollte von der Shell expandiert werden anstatt es jedem Anwendungsprogramm einzeln aufzubürden. Ich würde nur Dateinamen verarbeiten und Windowsbenutzern sagen, sie sollen gefälligst eine ordentliche Shell benutzen.
Antworten