Open() et les codecs.open() en Python 2.7 comportement étrange de différentes
J'ai un fichier texte avec la première ligne de caractères unicode et toutes les autres lignes en ASCII.
J'essaie de lire la première ligne comme une variable, et que toutes les autres lignes comme de l'autre. Cependant, lorsque j'utilise le code suivant:
# -*- coding: utf-8 -*-
import codecs
import os
filename = '1.txt'
f = codecs.open(filename, 'r3', encoding='utf-8')
print f
names_f = f.readline().split(' ')
data_f = f.readlines()
print len(names_f)
print len(data_f)
f.close()
print 'And now for something completely differerent:'
g = open(filename, 'r')
names_g = g.readline().split(' ')
print g
data_g = g.readlines()
print len(names_g)
print len(data_g)
g.close()
J'obtiens le résultat suivant:
<open file '1.txt', mode 'rb' at 0x01235230>
28
7
And now for something completely differerent:
<open file '1.txt', mode 'r' at 0x017875A0>
28
77
Si je n'utilise pas readlines(), ensemble de lectures de fichier, pas seulement les 7 premières lignes à la fois à des codecs.open() et open().
Pourquoi une telle chose se produire?
Et pourquoi ne codecs.open() lire le fichier en mode binaire, malgré le paramètre " r " est ajouté?
Upd: C'est le fichier d'origine: http://www1.datafilehost.com/d/0792d687
codecs.open()
est pour ouvrir le fichier en mode binaire pour éviter octets regard comme des retours à la ligne interprété, avant de décodage. UTF-16 retours à la ligne sont \n\x00
ou \x00\n
par exemple.Il avait de l'aide si vous avez partagé votre entrée d'origine du fichier.
Merci pour votre réponse! Voici le fichier: wikisend.com/download/406380/1.txt
C'est un bug, comme l'a observé le Wooble: stackoverflow.com/questions/18052971/...
OriginalL'auteur Kriattiffer | 2013-04-21
Vous devez vous connecter pour publier un commentaire.
Parce que vous avez utilisé
.readline()
première, lecodecs.open()
fichier a rempli un linebuffer; l'appel suivant à.readlines()
retourne seulement de la mémoire tampon lignes.Si vous appelez
.readlines()
nouveau, le reste des lignes sont retournés:Travail est de ne pas mélanger
.readline()
et.readlines()
:Ce comportement est vraiment un bug; le Python devs sont au courant, voir question 8260.
L'autre option est d'utiliser
io.open()
au lieu decodecs.open()
; laio
bibliothèque est ce que Python 3 pour mettre en œuvre le haut-open()
fonction et qui est beaucoup plus robuste et polyvalent que lecodecs
module.code
".join(data_f)'code
etcode
".join(names_f)code
sont à peu près égaux.OriginalL'auteur Martijn Pieters