2010-05-09 9 views
8

Ich habe eine Reihe von Dateien. Einige sind Unix-Zeilenenden, viele sind DOS. Ich möchte jede Datei testen, um zu sehen, ob if dos formatiert ist, bevor ich die Zeilenenden umschalte.Wie kann ich DOS-Zeilenumbrüche in einer Datei erkennen?

Wie würde ich das tun? Gibt es eine Flagge, für die ich testen kann? Sowas ähnliches?

+0

gleiche Frage wie http: // stackoverflow.com/questions/121392/how-to-determine-the-line-ending-of-a-file (außer diesem ist 'python' getaggt :-) – Jonik

Antwort

6

Sie könnten die Zeichenfolge nach \r\n suchen. Das ist DOS-Stil Zeilenende.

EDIT: Werfen Sie einen Blick auf this

+0

Ja, das ist der Weg zu gehen. Es gibt keine Flagge oder irgendetwas. – Jonik

+0

Technisch suchen Sie nach "" \ r \ x0A "'. Die meisten Compiler verwenden den Zeilenvorschub für "\ n", müssen diesen Wert jedoch nicht haben. –

0

dos Zeilenumbrüchen \r\n sind, Unix nur \n. Suchen Sie einfach nach \r\n.

1

Als ein kompletter Python-Neuling & nur zum Spaß, habe ich versucht, eine minimalistische Möglichkeit zu finden, dies für eine Datei zu überprüfen. Dies scheint zu funktionieren:

if "\r\n" in open("/path/file.txt","rb").read(): 
    print "DOS line endings found" 

bearbeiten: vereinfacht per John Machin Kommentar (keine Notwendigkeit reguläre Ausdrücke zu verwenden).

+0

Sollten Sie die Datei nicht mit "rb" öffnen? –

+0

Hmm, mein erster Gedanke war nein, weil wir es mit * text * -Dateien zu tun haben ... Aber beziehen Sie sich darauf: "Die Standardeinstellung ist die Verwendung des Textmodus, der '\ n' Zeichen in eine Plattform umwandelt- spezifische Darstellung beim Schreiben und beim Lesen. " (http://docs.python.org/library/functions.html#open)? Mir waren solche Konvertierungen nicht bekannt - vielleicht sollte "rb" tatsächlich dafür verwendet werden, auch auf Nicht-Unix-Systemen zu arbeiten. – Jonik

+2

're.search()' ist nicht minimalistisch; es ist OVERKILL; benutze '" \ r \ n "in open (...). read()'. Es gibt kein "vielleicht" über die Verwendung von '" rb "'; es ist ein Muss. –

3

(Python 2 nur :) Wenn Sie nur Dateien Text lesen möchten, entweder DOS oder Unix-Format, das funktioniert:

print open('myfile.txt', 'U').read() 

Das heißt, Python "universal" Datei-Reader automatisch all die verschiedenen Zeilenende-Markierungen, die in "\ n" übersetzt werden.

http://docs.python.org/library/functions.html#open

(Dank Griff!)

+1

Nun, ich werde sie in vim bearbeiten wollen. Ich möchte diese Zeilenendung einmal ändern lassen und sie festschreiben, vs pro Datei. – chiggsy

+2

Dies wird DOS CRLF destruktiv im aktuellen Verzeichnis für alle Dateien auf Unix LF ändern: perl -p0i -e 's/\ r \ n/\ n/g * ich diese so oft eingegeben haben meine Finger haben es auswendig gelernt :) – johntellsall

+0

@chiggsy installieren Sie das Paket dos2unix, und führen Sie den Befehl dos2unix auf die Dateien eher. – nos

22

Python kann automatisch erkennen, welche Newline Konvention in einer Datei verwendet wird, dank des "Universal-Newline-Modus" (U), und Sie können Python zugreifen erraten durch das newlines Attribut Dateiobjekte:

f = open('myfile.txt', 'U') 
f.readline() # Reads a line 
# The following now contains the newline ending of the first line: 
# It can be "\r\n" (Windows), "\n" (Unix), "\r" (Mac OS pre-OS X). 
# If no newline is found, it contains None. 
print repr(f.newlines) 

Dies das newline Ende der ersten Zeile gibt (Unix, DOS, etc.), wenn irgendein.

Wie John M. wies darauf hin, wenn Sie eine pathologische Datei, die mehr als eine Newline-Codierung verwendet, zufällig, f.newlines ist ein Tupel mit allen bisherigen Zeilencodierungen, nach dem Lesen von vielen Zeilen.

Referenz: http://docs.python.org/2/library/functions.html#open

Wenn Sie nur eine Datei konvertieren möchten, können Sie einfach tun:

with open('myfile.txt', 'U') as infile: 
    text = infile.read() # Automatic ("Universal read") conversion of newlines to "\n" 
with open('myfile.txt', 'w') as outfile: 
    outfile.write(text) # Writes newlines for the platform running the program 
+1

-1 Es heißt' newlines' (Plural) und es ist keine Kodierung. Was Sie gezeigt haben, ist, wie Sie herausfinden können, was (wenn überhaupt) die erste Zeile beendet (falls vorhanden). Ihr Kommentar ist inkorrekt: Er enthält nicht den Fall, dass die erste Zeile und die einzige Zeile nicht beendet werden (und 'newlines' verweist auf' None'). Außerdem wird davon ausgegangen, dass alle Zeilen auf dieselbe Weise terminiert sind. Verkettungen von Dateien unterschiedlicher Zeilenendungen sind nicht unbekannt. In der OP-Anwendung der Standardisierung auf eine Zeile endet, muss er ALL die Eingabedatei (und alle Dokumente, vor allem, wo es Tupel erwähnt) lesen. –

+2

@John: Komm schon: -1 für eine Antwort, die die nützlichen 'Zeilenumbrüche 'erwähnt, aber nur mit einem Tippfehler? Oder für pathologische Dateien, die aus Dateien mit unterschiedlichen Newline-Konventionen zusammengesetzt sind? Das Originalplakat erwähnt "Dateien von Unix oder DOS", nicht so seltsame Dateien! – EOL

+0

@John: Ihre Informationen über f.newlines, die im Fall einer gemischten Newline-Konvention ein Tupel zurückgeben, sind interessant. Ich habe es der Antwort hinzugefügt. – EOL

0

Mit grep & bash:

grep -c -m 1 $'\r$' file 

echo $'\r\n\r\n' | grep -c $'\r$'  # test 

echo $'\r\n\r\n' | grep -c -m 1 $'\r$' 
Verwandte Themen