Befehl aus vim in Python Skript impl.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
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!!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich meinte für mich selber, für meine Sachen, immer das neuere file() statt open() zu nehmen...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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. :?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

Hui danke für die Antworten...
werds gleich ausprobieren
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.
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?
Gast

sorry des doppelpostings...

ref_file wurde vorher schon belegt mit "ref_file.txt"
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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Antworten