Python Écrire des octets dans un fichier

144

J'ai une fonction qui renvoie une chaîne. La chaîne contient des retours chariot et de nouveaux sauts de ligne (0x0D, 0x0A). Cependant, lorsque j'écris dans un fichier, il ne contient que les nouveaux sauts de ligne. Existe-t-il un moyen d'obtenir la sortie pour inclure le retour chariot et le nouveau saut de ligne.

msg = function(arg1, arg2, arg3)
f = open('/tmp/output', 'w')
f.write(msg)
f.close()
Blackninja543
la source
avoir une lecture defile.__doc__
wim

Réponses:

257

Si vous souhaitez écrire des octets, vous devez ouvrir le fichier en mode binaire.

f = open('/tmp/output', 'wb')
Ignacio Vazquez-Abrams
la source
8
Étant donné qu'OP semble utiliser une plate-forme non Windows, cela ne fonctionne que dans Py3. Dans Py2, vous devrez utiliser io.open.
lvc
2
Je pense que c'est un bogue en python lui-même, étant donné que python peut détecter les types de données au moment de l'exécution, et peut détecter entre les entrées binaire et texte, je pense qu'il devrait être corrigé en python lui-même, pourquoi des centaines de personnes se retrouvent dans cette page, si cela aurait pu être évité par une instruction if dans le python stdlib, upvote si vous êtes d'accord, downvote me faire l'oubli si vous le devez.
Felipe Valdes
2
@FelipeValdes malheureusement, cela pourrait introduire des surprises lors de l'écriture de contenu s'il était détecté de manière incorrecte. Encore plus ennuyeux, cette détection incorrecte ne peut se produire que dans certains cas de bord étranges qui deviennent surprenants et difficiles à localiser. M'appuyer sur un comportement explicite à la place, même si cela signifie que nous avons cette question, garantit que je peux avoir une certitude sur la façon dont IO se comporte dans différents scénarios.
Liam Dawson
1
quelle extension auraient les fichiers octets?
chia yongkang
@FelipeValdes il se rapporte au principe de moindre surprise / étonnement ( en.wikipedia.org/wiki/Principle_of_least_astonishment ). Votre méthode serait mieux nommée:open_and_detect_file_type()
henrycjc