web-dev-qa-db-fra.com

Comment écrire des caractères de fin de ligne Unix dans Windows en utilisant Python

Comment puis-je écrire dans des fichiers en utilisant Python (sous Windows) et utiliser le caractère de fin de ligne Unix?

par exemple. En faisant:

 f = open ('file.txt', 'w') 
 f.write ('hello\n') 
 f.close () 

Python remplace automatiquement\n par\r\n.

67
tttppp

Pour Python 2 & 3

Voir: La manière moderne: utilisez newline = '' réponse sur cette même page.

Pour Python 2 uniquement (réponse originale)

Ouvrez le fichier au format binaire pour empêcher la traduction des caractères de fin de ligne:

f = open('file.txt', 'wb')

Citant le manuel Python:

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 sous 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 de les données de fichier sont correctes pour les fichiers texte ASCII, mais cela corrompra les données binaires comme celles des fichiers JPEG ou EXE. Soyez très prudent lorsque vous lisez et écrivez de tels fichiers en mode binaire. Sous Unix, cela ne fait pas de mal d'ajouter un "b" au mode, vous pouvez donc l'utiliser indépendamment de la plate-forme pour tous les fichiers binaires.

59
Tamás

La manière moderne: utilisez newline = ''

Utilisez le paramètre de mot clé newline= Pour io.open () pour utiliser les terminateurs de fin de ligne de style Unix LF:

import io
f = io.open('file.txt', 'w', newline='\n')

Cela fonctionne dans Python 2.6+. Dans Python 3, vous pouvez également utiliser le paramètre newline= Intégré de la fonction open()) de io.open().

L'ancienne façon: le mode binaire

L'ancienne façon d'empêcher la conversion de nouvelle ligne, qui ne fonctionne pas dans Python 3, est d'ouvrir le fichier en binaire mode pour empêcher la traduction des caractères de fin de ligne:

f = open('file.txt', 'wb')    # note the 'b' meaning binary

mais en Python 3, le mode binaire lira octets et non caractères donc il ne fera pas ce que vous voulez. Vous obtiendrez probablement des exceptions lorsque vous essayez de faire des E/S de chaîne sur le flux (par exemple "TypeError: 'str' ne prend pas en charge le tampon interface").

78
Colin D Bennett

Vous devrez utiliser le pseudo-mode binaire lors de l'ouverture du fichier.

f = open('file.txt', 'wb')
8
Jonathan Feinberg