Seite 1 von 1

Befehl aus vim in Python Skript impl.

Verfasst: Donnerstag 3. Februar 2005, 11:52
von Gast
Hallo
ich möchte den vim-Editor Befehl :set fileformat=unix

aus einem Python Skript aufrufen.
Allerdings weiß ich absolut nicht wie ich das anstellen soll.

Es geht darum dass ich ein text file einlese welches nicht unix format hat. Ich brauche aber das Unix format damit die blöden ^M am Ende jeder Zeile verschwinden und damit mein Programm richtig funktioniert.

Für Hilfe bin ich sehr dankbar!

Cya

Verfasst: Donnerstag 3. Februar 2005, 12:13
von mawe
Hi!

Keine Ahnung wie Du dem vim-Befehl aufrufen kannst.
Du könntest aber entweder:
-) das Programm dos2unix aus dem Python-Script heraus aufrufen, oder
-) alle \r mittels Python aus der Textdatei entfernen (wenn mich nicht alles täuscht, kommt das ^M ja nur daher, daß Windows für ein Newline \r\n verwendet)

Gruß, mawe

Verfasst: Donnerstag 3. Februar 2005, 13:25
von Gast
Ja genau...;)
ich müsste immer die \r löschen.
Komischerweise habe ich beobachtet dass auf meiner suse distri das programm läuft ohne \r und auf FEdora Core net....frag mich net warum aber is so....

Deswegen würde ich gern die files auf jeden Fall aufs unix format bringen wollen...

Trotzdem Danke für deine Hilfe!!

Verfasst: Donnerstag 3. Februar 2005, 14:06
von Dookie
Hi Gast,

Du kannst dir auch eine kleine Zeile in die /.vim/vimrc schreiben, die immer das Fileformat auf unix setzt nach dem Einlesen einer Datei in vim.

Code: Alles auswählen

au BufReadPost *.* set fileformat=unix
Falls es sich um bestimmte Dateien handelt kannst Du auch statt *.* z.B. *.foo oder ähnliches verwenden.

Gruß

Dookie

Verfasst: Donnerstag 3. Februar 2005, 14:11
von mawe
Hi Dookie!

Guter Tipp! Ich glaube aber, daß Gast vim gar nicht verwenden will, sondern die Textdatei gleich nach dem Download (oder wo die auch immer herkommt) mit Python bearbeiten will. Jedenfalls hab ich's so verstanden.

Gruß, mawe

Verfasst: Donnerstag 3. Februar 2005, 14:29
von Dookie
tja, dann

Code: Alles auswählen

f = file("text.txt", "rU")
#mach was mit der Datei
f.close()
das U öffnet die Datei mit "universal newline support". D.h. jedes zeilenende wird als \n gelesen, egal ob \r\n \n \r.


Gruß

Dookie

Verfasst: Donnerstag 3. Februar 2005, 15:41
von jens
Das ist ja cool!!! Warum nicht also immer file() ???

Aus der Dok:
The file() constructor is new in Python 2.2. The previous spelling, open(), is retained for compatibility, and is an alias for file().

Verfasst: Donnerstag 3. Februar 2005, 15:45
von Leonidas
jens hat geschrieben:Das ist ja cool!!! Warum nicht also immer file() ???

Aus der Dok:
The file() constructor is new in Python 2.2. The previous spelling, open(), is retained for compatibility, and is an alias for file().
Nochmal lesen, das steht doch drin.
Wenn man open() aus, sagen wir mal Python 2.5 rausnimmt, kannst du keine Python 2.1 Skripte mehr ausführen, da diese alle open nutzen, was es dann aber nicht mehr gibt. Logisch?

Verfasst: Donnerstag 3. Februar 2005, 16:28
von jens
Ich meinte für mich selber, für meine Sachen, immer das neuere file() statt open() zu nehmen...

Verfasst: Donnerstag 3. Februar 2005, 16:58
von Leonidas
Ja klar, solange du keine komatibilität zu Python 2.1 brauchst. In meiner Erfahrung scheitert bei mit die Kompatibilität schon an ganz anderen Sachen. :?

Verfasst: Freitag 4. Februar 2005, 02:24
von BlackJack
Die Doku ist an der Stelle etwas irreführend! file() soll keineswegs open() ersetzen und man sollte auch weiterhin open() verwenden um Dateien zu öffnen.

file() ist bloss dazugekommen weil man mittlerweile von den ganzen eingebauten Typen erben kann und es irgendwie bescheuert/falsch aussieht von "open" zu erben:

Code: Alles auswählen

class Foo(open): pass

# versus

class Bar(file): pass
Es gab Anfang dieses Jahres einen doc bug report, der mittlerweile wohl auch in die Entwicklerdoku eingeflossen ist.

Verfasst: Freitag 4. Februar 2005, 13:28
von Leonidas
Was macht das für einen Unterschied? Ich nutze seit jeher file(), da mir der Name auch besser gefällt, ich ihn beschriebender finde. Funktionieren tut es ja genauso.

Verfasst: Freitag 4. Februar 2005, 19:13
von Gast
Hui danke für die Antworten...
werds gleich ausprobieren

Verfasst: Freitag 4. Februar 2005, 23:53
von BlackJack
Leonidas hat geschrieben:Was macht das für einen Unterschied? Ich nutze seit jeher file(), da mir der Name auch besser gefällt, ich ihn beschriebender finde. Funktionieren tut es ja genauso.
Im Moment macht es keinen Unterschied weil beide Namen das selbe Objekt bezeichnen. Wird sich wohl auch nicht ändern. Ich wollte halt nur sagen, dass die Doku an dieser Stelle vielleicht den Eindruck erweckt, dass man nur noch file() verwenden soll und open() veraltet ist. Guido van Rossum sieht das aber anders, file war nur zum erben gedacht.

Verfasst: Dienstag 8. Februar 2005, 09:28
von Gast
Hallo,
hmmm
irgendwie funktioniert das mit dem "rU" nicht so ganz...

Bei ist der code folgendermaßen:

Code: Alles auswählen

ref_file = file(ref_file, "rU") # rU -> read in Unix fileformat
lines_in_ref_file = ref_file.readlines()
remove_all(lines_in_ref_file,"\n")
ref_file.close()
Wieso?

Verfasst: Dienstag 8. Februar 2005, 09:28
von Gast
sorry des doppelpostings...

ref_file wurde vorher schon belegt mit "ref_file.txt"

Verfasst: Dienstag 8. Februar 2005, 13:33
von BlackJack
Ich weiss jetzt nicht ob das nicht ein kleines 'u' sein muss.

Ansonsten sag doch bitte mal, was genau nicht funktioniert. Was erwartest Du und was bekommst Du statt dessen.

Verfasst: Dienstag 8. Februar 2005, 13:57
von Dookie
Hi,

"U" muss schon gross sein, siehe pydoc file
geht das?

Code: Alles auswählen

ref_file = file(ref_file, "rU") # rU -> read with "universal newline"
lines_in_ref_file = list(ref_file) #  more efficient than ref_file.readlines()
ref_file.close() 
# remove all newlines
lines_in_ref_file = [x.rstrip('\n') for x in lines_in_ref_file]
könnte man so noch etwas komprimieren:

Code: Alles auswählen

ref_file = file(ref_file, "rU") # rU -> read with "universal newline"
lines_in_ref_file = [x.rstrip('\n') for x in ref_file]
ref_file.close() 
Gruß

Dookie