2011-01-05 5 views
28

Mam skrypt Pythona, który dał różne dane wyjściowe po uruchomieniu na komputerze z systemem Windows i po uruchomieniu na komputerze Mac. Po głębszym wykopaniu odkryłem, że dzieje się tak dlatego, że gdy Python odczytuje przerwy w wierszach na komputerze Mac (z pliku), to odczytał on w \r\n, podczas gdy jakoś w systemie Windows \r znika.Obsługa r n vs n nowe linie w pythonie na komputerze Mac vs Windows

Tak więc, jeśli zmienię co \n w skrypcie na \r\n, to działa poprawnie na komputerze Mac. Ale jeśli to zrobię, przestanie działać na komputerze z systemem Windows.

Czy istnieje prosty sposób na rozwiązanie tego problemu?

+0

masz ten błąd podczas odczytywania z pliku? Którą wersją Pythona jesteś? Skąd to masz? Python jest zwykle zbudowany z uniwersalną obsługą nowego wiersza: – Falmarri

+0

@Falmarri Python 3 ... i jestem pewien, że dostałem go z oficjalnej strony Pythona – wrongusername

+3

Oto kolejna niespójność systemu Windows i systemu Linux - w systemie Windows funkcja glob.glob w Pythonie zawsze zwraca listę nazwy plików, posortowane alfabetycznie. W systemie Linux lista nazw plików jest zwracana w losowej kolejności. – PaulMcG

Odpowiedz

22

Myślę, że może to zależeć od tego, co czytasz, ale wbudowana funkcja open() przyjmuje parametr "mode", a jeśli przełączysz "U" dla trybu, Python zajmie się nowe linie w sposób międzyplatformowy w sposób przejrzysty. Wymaga to zbudowania Pythona z uniwersalną obsługą newline, ale przetestuj to!

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

+0

To jest również domyślne (o ile wiem) – Falmarri

+0

Dzięki! Teraz działa dobrze!Oh i @Falmarri przepraszam, jedynym sposobem, w jaki wiedziałem, jak czytać z pliku, było '' r''. Przynajmniej teraz wiem lepiej. – wrongusername

+0

Hmm, wygląda na to, że to nie jest domyślne w pythonie 3. To wydaje się dziwne. – Falmarri

34

różne platformy mają różne kody dla "nowej linii". Windows ma \ r \ n, Unix ma \ n, stare macki mają \ r i tak, są też systemy, które \ n \ r też.

Po otwarciu pliku w trybie tekstowym w Pythonie 3, przekształci on wszystkie znaki nowej linii na '\ n' i zakończy pracę.

infile = open("filename", 'r') 

Tryb tekstowy jest domyślny, więc jeśli nic nie mówisz, jest to tryb tekstowy. Ale to zawsze lepiej być wyraźne:

infile = open("filename", 'rt') 

Jeśli nie chcesz tłumaczenie zakończeń linii wydarzy, należy otworzyć plik w trybie binarnym:

infile = open("filename", 'rb') 

W Pythonie 2 jest inaczej. Tam ta konwersja miałaby miejsce tylko domyślnie w systemie Windows. Jeśli chcesz to się stało na innych platformach, można dodać uniwersalnego nowej linii flag

infile = open("filename", 'rU') 

jednak można powiedzieć, że jesteś w Pythonie 3, i nie zdarza się w trybie tekstowym na wszystkich platformach więc dodanie flagi U nie powinno mieć znaczenia.

+0

Dziękuję bardzo, miałem pomysł, że to było tak, zajęło mi dość dużo czasu, aby to potwierdzić, ale tak, mój kod pracował na python 2.7, ale glitched na python 3.2 z powodu tej różnicy. Musiałem to "zepsuć" ... dzięki, bardzo dokładne wyjaśnienie. – sinekonata

+0

'os.linesep' zastępuje się' \ n' podczas czytania w trybie tekstowym na * wszystkich * platformach (nie tylko Windows). Jeśli 'os.linesep ==„\ n'' to jest taka sama jak bez konwersji na Pythonie 2. – jfs

+0

@JFSebastian: co w praktyce oznacza, że ​​zdarza się tylko w systemach Windows i Mac OS (9, ale to nie jest wspierany od Python 2.4). Podczas gdy w Pythonie 3 wszystkie kombinacje wierszy zostaną przetłumaczone na '\ n'' na wszystkich platformach. –