Python Zapisuje bajty do pliku

143

Mam funkcję, która zwraca ciąg. Ciąg zawiera znaki powrotu karetki i nowe znaki nowego wiersza (0x0D, 0x0A). Jednak kiedy piszę do pliku, zawiera on tylko nowe źródła linii. Czy istnieje sposób, aby dane wyjściowe obejmowały powrót karetki i nowy znak nowego wiersza.

msg = function(arg1, arg2, arg3)
f = open('/tmp/output', 'w')
f.write(msg)
f.close()
Blackninja543
źródło
przeczytajfile.__doc__
wim

Odpowiedzi:

257

Jeśli chcesz zapisywać bajty, powinieneś otworzyć plik w trybie binarnym.

f = open('/tmp/output', 'wb')
Ignacio Vazquez-Abrams
źródło
8
Ponieważ OP wydaje się używać platformy innej niż Windows, działa to tylko w Py3. W Py2 musiałbyś użyć io.open.
lvc
2
Myślę, że jest to błąd w samym Pythonie, biorąc pod uwagę, że Python może wykrywać typy danych w czasie wykonywania i może wykrywać dane wejściowe binarne i tekstowe, myślę, że powinno to zostać naprawione w samym Pythonie, dlaczego setki ludzi kończą na tej stronie, jeśli można było tego uniknąć, używając instrukcji if w standardowej bibliotece języka Python. Głosuj w górę, jeśli się zgadzasz, Głosuj w dół do zapomnienia, jeśli musisz.
Felipe Valdes
2
@FelipeValdes, niestety, mogłoby wprowadzić niespodzianki podczas pisania treści, jeśli kiedykolwiek zostanie nieprawidłowo wykryta. Jeszcze bardziej irytujące jest to, że nieprawidłowe wykrycie mogło się zdarzyć tylko w pewnych dziwnych przypadkach, które stają się zaskakujące i trudne do wyśledzenia. Poleganie zamiast tego na jawnym zachowaniu, nawet jeśli oznacza to, że mamy to pytanie, zapewnia, że ​​mogę mieć pewność co do sposobu, w jaki IO zachowuje się w różnych scenariuszach.
Liam Dawson
1
jakie rozszerzenie miałyby pliki bajtowe?
chia yongkang
@FelipeValdes odnosi się do zasady najmniejszego zaskoczenia / zdziwienia ( en.wikipedia.org/wiki/Principle_of_least_astonishment ). Twoja metoda byłaby open_and_detect_file_type()
trafniej