2016-06-28 36 views
14

moduł os Pythona zawiera wartość dla konkretnej platformy linii oddzielającej ciąg, ale docs wyraźnie powiedzieć, aby nie używać go podczas pisania do pliku:Do czego służy os.linesep?

Nie używaj os.linesep jako terminator wiersza podczas zapisywania plików otwarty w trybie tekstowym (domyślny); zamiast tego użyj pojedynczego "\ n" na wszystkich platformach.

Docs

Previous questions zbadali dlaczego nie powinno go używać w tym kontekście, ale to co kontekst jest przydatna? Kiedy powinieneś użyć separatora linii i po co?

Odpowiedz

7

docs wyraźnie powiedzieć nie go używać podczas pisania do pliku

To nie jest dokładny, doc mówi, aby nie stosować go w trybie tekstowym.

Urządzenie os.linesep jest używane do iteracji po liniach pliku tekstowego. Wewnętrzny skaner rozpoznaje os.linesep i zastępuje go pojedynczym "\ n".

Dla ilustracji napisać pliku binarnej, który zawiera 3 linie rozdzielone "\ r \ n" (Windows ogranicznika)

import io 

filename = "text.txt" 

content = b'line1\r\nline2\r\nline3' 
with io.open(filename, mode="wb") as fd: 
    fd.write(content) 

zawartość pliku binarnym:

with io.open(filename, mode="rb") as fd: 
    for line in fd: 
     print(repr(line)) 

NB: Użyłem trybu "rb", aby odczytać plik jako plik binarny.

uzyskać:

b'line1\r\n' 
b'line2\r\n' 
b'line3' 

Gdybym odczytać zawartość pliku przy użyciu trybu tekstowego, tak:

with io.open(filename, mode="r", encoding="ascii") as fd: 
    for line in fd: 
     print(repr(line)) 

uzyskać:

'line1\n' 
'line2\n' 
'line3' 

Separator zastępuje się "\ n".

os.linesep stosowany jest również w trybie zapisu: dowolny znak "\ n" jest konwertowany do standardowego układu separatora wiersza: "\ r \ n" na Windows, "\ n" na POSIX, itp

Dzięki funkcji io.open możesz wymusić separator linii na dowolne życzenie.

Przykład: jak napisać pliku Windows tekst:

with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd: 
    fd.write("one\ntwo\nthree\n") 

Jeśli czytasz ten plik w trybie tekstowym jak poniżej:

with io.open(filename, mode="rb") as fd: 
    content = fd.read() 
    print(repr(content)) 

otrzymasz:

b'one\r\ntwo\r\nthree\r\n' 
4

Jak wiadomo, odczytywanie i zapisywanie plików w trybie tekstowym w Pythonie konwertuje specyficzny dla platformy separator linii na "\ n" i na odwrót. Ale jeśli czytasz plik w trybie binarnym, konwersja nie ma miejsca. Następnie możesz jawnie przekonwertować zakończenia linii, używając string.replace(os.linesep, '\n'). Może to być przydatne, jeśli plik (lub strumień lub coś w tym rodzaju) zawiera kombinację danych binarnych i tekstowych.

+0

To Wouldn Działa, jeśli kodowanie jest niezgodne z ASCII. 'len ('\ n'.encode (' utf-16 '))' wynosi 4 –