2009-02-04 9 views
1

J'utilise Python 2.6 pour lire le fichier encodé latin2 avec les fins de ligne Windows ('\ r \ n').Caractères de nouvelle ligne dans les fichiers non codés en ASCII

import codecs 

file = codecs.open('stackoverflow_secrets.txt', encoding='latin2', mode='rt') 
line = file.readline() 
print(repr(line)) 

sorties: u'login: yabcok\n'

file = codecs.open('stackoverflow_secrets.txt', encoding='latin2', mode='r') 
line = file.readline() 
print(repr(line)) 

ou

file = codecs.open('stackoverflow_secrets.txt', encoding='latin2', mode='rb') 
line = file.readline() 
print(repr(line)) 

sorties: u'password: l1x1%Dm\r\n'

Mes questions:

  1. Pourquoi le mode texte n'est pas le mode par défaut? La documentation indique le contraire. Le module codecs est-il couramment utilisé avec les fichiers binaires?
  2. Pourquoi les caractères newline ne sont pas supprimés de la sortie readline()? C'est ennuyeux et redondant.
  3. Existe-t-il un moyen de spécifier un caractère de nouvelle ligne pour les fichiers non codés en ASCII.

Répondre

4

Etes-vous sûr que vos exemples sont corrects? Le documentation du module codecs dit:

Note: Les fichiers sont toujours ouverts en mode binaire, même si aucun mode binaire n'a été spécifié. Ceci est fait pour éviter la perte de données due aux encodages utilisant des valeurs de 8 bits. Cela signifie qu'aucune conversion automatique de '\ n' n'est effectuée en lecture et en écriture.

Sur mon système, avec un fichier codé Latin-2 + terminaisons de ligne DOS, il n'y a pas de différence entre "rt", "r" et "rb" (Avertissement: J'utilise 2.5 sur Linux).

La documentation pour open ne mentionne pas non plus d'indicateur "t", de sorte que le comportement semble un peu étrange.

Les caractères de nouvelle ligne ne sont pas supprimés des lignes car toutes les lignes renvoyées par readline peuvent ne pas se terminer par des retours à la ligne. Si le fichier ne se termine pas par un saut de ligne, la dernière ligne n'en contient pas. (Je ne peux évidemment pas trouver une meilleure explication).

Les caractères de nouvelle ligne ne varient pas en fonction du codage (du moins pas parmi ceux qui utilisent ASCII pour 0-127), uniquement en fonction de la plate-forme. Vous pouvez spécifier "U" dans le mode lors de l'ouverture du fichier et Python détectera toute forme de nouvelle ligne, que ce soit Windows, Mac ou Unix.

+0

Je sais que les nouvelles lignes ne sont pas différentes mais le reste du texte est, donc je dois utiliser l'API des codecs. U est obsolète (http://docs.python.org/library/io.html#io.open), mais vous avez raison sur la note. J'utilise Windows XP et les résultats sont comme ci-dessus. –

+0

Eh bien, je devrais vraiment passer à 2.6, mais je suis dans les derniers stades d'un plus grand projet et même je ne suis pas assez audacieux pour changer maintenant. Désolé de ne pas pouvoir vous aider. –

1

mode = 'rt'

'rt' est pas un mode réel en tant que tel - qui fera la même chose que 'r'.

Pourquoi le mode texte n'est pas le mode par défaut?

Voir la réponse de Torsten. En outre, si vous utilisez autre chose que Windows, les fichiers en mode texte se comportent de la même manière que les fichiers binaires.

Vous pourriez plutôt penser au mode 'U'niversal newlines', qui tente de faire fonctionner les fichiers en mode texte d'autres plates-formes. Alors qu'il est possible de passer un drapeau «U» à codecs.open, compte tenu de la doc comme indiqué ci-dessus, je pense que c'est bug. Certes, les résultats seraient mauvais sur UTF-16 et certains codecs d'Asie de l'Est, alors ne vous y fiez pas. Pourquoi les caractères newline ne sont-ils pas supprimés de la sortie readline()?

Il est nécessaire de savoir si la dernière ligne du fichier se termine par une nouvelle ligne de fin.

Questions connexes