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()

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')

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.