Que signifie «wb» dans ce code, en utilisant Python?

107

Code:

file('pinax/media/a.jpg', 'wb')
zjm1126
la source
Vous devriez également envisager d'utiliser openau lieu de file. fileétait obsolète dans Python 2 (impossible de trouver quelle version) et a été supprimé dans py3k. (merci Scott) Voir cette question pour plus d'informations.
Luiz Damim
1
Utilisez à la openplace de file, qui était obsolète dans Python 2 et supprimé dans Python 3. Voir stackoverflow.com/questions/112970/...
Max Ghenis
2
Il n'est pas vraiment juste de supposer qu'il s'agit du propre code du PO, surtout compte tenu de la nature de la question. C'était évidemment valable à un moment donné.
mckenzm

Réponses:

112

Mode fichier , écriture et binaire. Puisque vous écrivez un fichier .jpg, ça a l'air bien.

Mais si vous êtes censé lire ce fichier jpg, vous devez utiliser 'rb'

Plus d'informations

Sous Windows, «b» ajouté au mode ouvre le fichier en mode binaire, il existe donc également des modes comme «rb», «wb» et «r + b». Python sur Windows fait une distinction entre les fichiers texte et binaires; les caractères de fin de ligne dans les fichiers texte sont automatiquement légèrement modifiés lorsque les données sont lues ou écrites. Cette modification en arrière-plan des données de fichier convient aux fichiers texte ASCII, mais elle corrompra les données binaires comme celles des fichiers JPEG ou EXE.

TU
la source
4
Concrètement, sous Windows pour un fichier ouvert en mode texte, fd.write("foo\n")écrit effectivement sur disque foo\r\n(notez le \r).
Serge Ballesta
4
Je suis à peu près sûr que «b» ouvre les fichiers en mode binaire sur toutes les plates-formes, pas seulement Windows ou il y aurait également une énorme mise en garde ici.
mckenzm
76

Le wbindique que le fichier est ouvert pour l'écriture en mode binaire.

Lors de l'écriture en mode binaire, Python n'apporte aucune modification aux données lorsqu'elles sont écrites dans le fichier. En mode texte (lorsque le best exclu comme juste wou lorsque vous spécifiez le mode texte avec wt), cependant, Python encodera le texte en fonction du codage de texte par défaut. De plus, Python convertira les fins de ligne ( \n) en quelle que soit la fin de ligne spécifique à la plate-forme, ce qui corromprait un fichier binaire comme un fichier exeou png.

Le mode texte doit donc être utilisé lors de l'écriture de fichiers texte (qu'il s'agisse de texte brut ou d'un format basé sur du texte comme CSV), tandis que le mode binaire doit être utilisé lors de l'écriture de fichiers non texte comme des images.

Références:

https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files https://docs.python.org/3/library/functions.html#open

Daniel G
la source
1
Cela peut avoir changé avec le temps. Sur Ubuntu 18.04 exécutant Python 3.6.8, le `` mode binaire '' importait définitivement. J'ai eu une erreur en essayant d'écrire dans un fichier texte (format CSV, pas que cela compte finalement beaucoup) qui a été ouvert avec l' wboption. En utilisant l' woption à la place, j'ai pu le faire fonctionner correctement.
TheDavidJohnson
1
Merci pour votre commentaire @TheDavidJohnson. De retour dans Python 2.6, la documentation indiquait que le bmode n'avait d'effet que sur Windows. Cela a maintenant été supprimé de la documentation et le mode binaire "devrait être utilisé pour tous les fichiers qui ne contiennent pas de texte".
Daniel G
1
Bien sûr, @Daniel! Je vous remercie de poster votre solution. Plus de 9 ans plus tard, c'est toujours utile. Est-ce que c'est génial? Dans tous les cas, je voulais juste ajouter de nouvelles informations pour d'autres comme moi qui pourraient encore venir et trouver cela utile. À votre santé!
TheDavidJohnson
Excellente explication. Une précision cependant: vous dites "Le mode texte doit donc être utilisé lors de l'écriture de fichiers texte" . Par souci d'exhaustivité, je renvoie à votre commentaire précédent selon lequel "Python ne fait aucun changement [en mode binaire]", et j'ajouterais que vous utiliseriez le mode binaire sur un fichier texte lorsque vous ne savez pas (ou ne vous souciez pas) de l'encodage. mais juste besoin de lire ou d'écrire les octets, ou si vous souhaitez conserver les fins de ligne quelle que soit la plate-forme.
pcdev
8

C'est le mode avec lequel vous ouvrez le fichier. "wb" signifie que vous écrivez dans le fichier (w) et que vous écrivez en mode binaire (b).

Consultez la documentation pour en savoir plus: clicky

GlenCrawford
la source